You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:45:01