scanf()输出异常:整数与字符输入代码单独正常,联合运行失败
整数与字符混合输入时scanf的缓冲区问题解决
问题重现
你的代码单独读取整数或字符都正常,但混合使用时,第一个字符输入会读取到换行符,导致预期的m无法输出:
#include<stdio.h> int main() { int base; char num1,num2,num3,num4; scanf("%i",&base); printf("%i\n",base); scanf("%c",&num1); scanf("%c",&num2); scanf("%c",&num3); scanf("%c",&num4); printf("%c",num1); return 0; }
输入:
8 m n o p
预期输出:
8 m
实际输出:
8
问题原因
当你输入8并按下回车时,scanf("%i", &base)只读取了整数8,但回车产生的换行符\n会留在输入缓冲区中。后续第一个scanf("%c", &num1)会直接读取这个换行符,而不是你输入的m。打印num1时输出的是换行,所以看起来没有打印m。
解决方法
方法1:在%c前添加空格跳过空白字符
scanf的格式串中,空格会匹配任意数量的空白字符(包括换行、空格、制表符),可以自动跳过缓冲区里的残留换行:
#include<stdio.h> int main() { int base; char num1,num2,num3,num4; scanf("%i",&base); printf("%i\n",base); // %c前加空格,跳过缓冲区中的空白字符 scanf(" %c",&num1); scanf(" %c",&num2); scanf(" %c",&num3); scanf(" %c",&num4); printf("%c",num1); return 0; }
方法2:读取整数后手动清除缓冲区的换行符
用getchar()读取并丢弃缓冲区里的换行符:
#include<stdio.h> int main() { int base; char num1,num2,num3,num4; scanf("%i",&base); printf("%i\n",base); // 吃掉缓冲区中残留的换行符 getchar(); scanf("%c",&num1); scanf("%c",&num2); scanf("%c",&num3); scanf("%c",&num4); printf("%c",num1); return 0; }
注意:不推荐使用fflush(stdin)
虽然很多编译器支持fflush(stdin)清空输入缓冲区,但这属于C标准未定义的行为,跨平台使用可能出现问题,因此优先选择前两种方法。
内容的提问来源于stack exchange,提问作者Lazy_head
相关产品推荐
相关产品推荐

