为何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




