You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何scanf后需用getchar()?C语言输入缓冲区问题解析

问题解析:scanf后gets无法输入字符串的原因

嘿,这个问题我太熟了,本质就是输入缓冲区里的残留字符在搞鬼,我给你一步步拆解清楚:

核心问题:输入缓冲区的残留换行符

当你执行scanf("%d", &n)输入数组大小(比如输入5然后按回车)时,输入缓冲区里实际存的是5\n(数字加上回车产生的换行符)。scanf只会读取数字部分,把换行符\n留在了输入缓冲区里

gets()的工作逻辑是:从输入缓冲区读取字符,直到碰到换行符\n就停止,并且会把这个换行符从缓冲区移除,但不会把它存入目标字符串。所以scanf执行完后,缓冲区里剩下的\n直接被gets()捕获,它误以为这就是你输入的结束信号,直接返回空字符串,程序就跳过输入步骤进入反转打印环节了,自然没法让你输入字符串。

为什么加getchar()就正常了?

getchar()的作用是从输入缓冲区读取单个字符,它会把scanf残留的那个\n给“吃掉”,清空了缓冲区。这时候gets()再运行时,输入缓冲区是空的,就会阻塞下来等你输入字符串,程序也就正常工作了。

额外提醒:gets()是不安全的函数

顺便提一句,gets()已经被C11标准废弃了,因为它完全不检查输入长度——如果输入的字符串超过了你malloc分配的n个字符空间,就会导致缓冲区溢出,触发未定义行为(比如程序崩溃、数据被篡改)。建议换成更安全的fgets(),用法示例:

// 替换原来的gets(arr);
fgets(arr, n, stdin);
// 可选:fgets会把换行符也读入字符串,若不需要可手动去除
if (strlen(arr) > 0 && arr[strlen(arr)-1] == '\n') {
    arr[strlen(arr)-1] = '\0';
}

内容的提问来源于stack exchange,提问作者Kasun Jalitha

火山引擎 最新活动