这一节是新手最容易困惑的地方但理解了缓冲区机制很多诡异 bug就豁然开朗了。1 getchar 与 putchargetchar()无参数有返回值返回输入的第一个字符的 ASCII 码putchar()输出一个字符charch;chgetchar();// 从键盘读一个字符putchar(ch);// 把它输出到屏幕小技巧给数组初始化时最好写成char str[10] {0};这样所有元素都会自动补成 0。如果不初始化数组里会是随机值垃圾值容易出问题。2 getch 与 putch无回显输入getchar有一个回显功能——你输入的字符会显示在屏幕上。但有时候我们不想显示比如输入密码这时就用getch()函数特点getchar()可输入多个字符回车结束有回显输入内容会显示getch()输入一个字符就结束无回显输入内容不显示适合密码注意getch()来自conio.hWindows 环境不是标准库函数跨平台时要留意。3 缓冲区机制——为什么会出现诡异的输出先看一段会让新手困惑的代码charch;charstr[10]{0};printf(Enter First Char);chgetchar();// 读取一个字符putchar(ch);gets(str);// 读取一个字符串注意 gets 已不安全见后文puts(str);// 输出字符串如果你输入abc输出可能是abc而不是你以为的先打印 a再打印 abc。为什么根本原因输入缓冲区没有被清空。那我们来详细拆解一下这个过程你从键盘输入的所有内容都会先进入输入缓冲区getchar()一次只取走一个字符。你输入abc它只拿走a而bc还留在缓冲区里接下来的gets()不会清空缓冲区它会先检查缓冲区里有没有内容——发现还有bc于是不等你键盘输入直接把 bc 拿走了所以bc被 gets 接收最终拼出了abc的输出。解决办法清空缓冲区fflush(stdin);// 刷新清空输入缓冲区在getchar()之后加上fflush(stdin);把残留的bc清掉前面的问题就消失了。小Tipsfflush(stdin)在 C 标准中其实是未定义行为在某些编译器如 Linux 下的 GCC上不起作用。更加推荐的做法是循环手动清空intc;while((cgetchar())!\nc!EOF);// 读到换行或文件结束为止