使用C语言getchar()、putchar()时出现非预期输入输出问题求解
问题原因
- 该现象和你使用的WSL Ubuntu+gcc环境无关,是C语言标准输入流的默认行缓冲机制导致的,所有符合C标准的运行环境都会出现相同表现。
getchar()从行缓冲的标准输入流读取字符,你输入字符后按下的回车键会被当做\n(换行符)存入输入缓冲区,换行符的ASCII码恰好为10,就是你输出末尾10的来源。- 你输入
f并按下回车时,输入缓冲区实际存入了两个字符:'f'和'\n'。第一次循环getchar()读取'f',输出102和字符f;第二次循环不需要等待输入,直接读取缓冲区剩余的'\n',输出10和换行符,最终你看到的输出就是102f10加换行。 - 你预期每次循环都会触发输入等待,是因为不了解行缓冲的特性:只要输入缓冲区有未读取的内容,
getchar()会直接读取返回,不会等待用户新的输入。
解决方法
如果你要实现每次循环读取一个用户输入的可见字符,跳过换行符的干扰,可根据需求选择以下两种方案:
方案1:每次读取后清空输入缓冲区
每次读完目标字符后,清空缓冲区中剩余的所有内容(包括换行符、多余输入的字符),确保下次getchar()一定会触发新的输入等待,适合要求每次只处理用户单次输入第一个字符的场景:
#include <stdio.h> int c; int main() { for(int x =0; x < 100; x++){ c = getchar(); printf("%d", c); putchar(c); // 清空缓冲区剩余的所有残留内容 while(getchar() != '\n'); } }
方案2:读取时跳过换行符
读到换行符时直接跳过不处理,适合需要处理用户单次输入多个字符的场景:
#include <stdio.h> int c; int main() { for(int x =0; x < 100; x++){ c = getchar(); // 遇到换行符跳过,不计入有效计数 if(c == '\n') { x--; continue; } printf("%d", c); putchar(c); } }
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

