C语言用scanf输入int后char自动跳过输入是什么原因?
问题原因
这个问题是C语言输入缓冲区的残留字符导致的,原理如下:
- 执行
scanf("%d", &age)输入10并按下回车时,%d格式符只会读取输入中的数字部分10,按下回车产生的换行符\n会残留在输入缓冲区内。 - 后续执行
scanf("%c", &grade)时,%c格式符的特性是不会跳过任何空白字符(包括换行、空格、制表符),会直接读取缓冲区中残留的\n作为grade的值,因此不会等待手动输入,直接执行后续打印逻辑。 - 如果把
grade的读取逻辑放到最前面,初始状态下输入缓冲区是空的,%c就会正常等待用户输入;而后续%d、%lf、%s这类格式符本身就会自动跳过输入开头的所有空白字符,所以不会受残留换行符的影响,运行正常。
解决方法
有三种常用的解决方案,优先推荐第一种:
- 在
%c前面加一个空格,告诉scanf跳过读取前的所有空白字符:
scanf(" %c", &grade); // 注意%c前面的空格
- 读取完int类型后,主动调用一次
getchar()吃掉残留的换行符:
scanf("%d", &age); getchar(); // 吃掉残留的\n
- 清空整个输入缓冲区,适合输入内容存在多余残留字符的场景:
while(getchar() != '\n'); // 循环读取直到遇到换行符,清空缓冲区
代码中的其他问题
你定义的存储姓名的变量类型错误:
// 错误写法:double是浮点类型,不能存储字符串 double name[5]; // 正确写法:用char数组存储字符串,数组长度要足够容纳输入的字符+末尾的\0结束符 char name[20];
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

