scanf()接收用户输入问题:读取带空格字符串后字符输入被跳过
问题原因
你的代码出现该现象的核心原因是输入缓冲区残留的换行符被第二个scanf直接读取:
- 第一个
scanf使用%[^\n]规则读取输入,只会读取到换行符\n之前的所有字符,不会处理末尾的换行符,执行完后这个\n会留在输入缓冲区里。 - 第二个
scanf使用%c格式符时,不会自动跳过空白字符,会直接把缓冲区里残留的\n读入findChar变量,因此不会等待用户手动输入。
解决方法
方法1(最推荐,跨平台兼容)
在第二个scanf的%c前加一个空格,这个空格会让scanf自动跳过输入缓冲区中所有前置的空白字符(包括换行符、空格、制表符等),再读取后续的非空白字符:
// 仅需修改这一行即可 scanf(" %c", &findChar);
方法2 主动吃掉缓冲区的换行符
在第一个字符串读取完成后,调用一次getchar()读取并丢弃残留的换行符:
scanf("%[^\n]", userIn); getchar(); // 读取并丢弃缓冲区残留的换行符
注意:如果用户输入的字符串长度超过了userIn的容量30,超出的字符会留在缓冲区,单次getchar()无法清理干净,这种场景下不推荐用该方法。
方法3 清空输入缓冲区(不推荐跨场景使用)
部分编译器支持使用fflush(stdin)清空输入缓冲区,但该操作属于C标准的未定义行为,仅在Windows平台的部分编译器(如Visual C++)中生效,跨平台或高要求场景不要使用。
修正后完整代码
#include <stdio.h> int main() { char userIn[30]; char findChar; printf("Please enter a string: "); // 加长度限制%29[^\n]避免缓冲区溢出,留1位存储字符串结束符\0 // 原代码后缀的s是多余的,%[^\n]本身就是完整的格式规则,不需要额外加s scanf("%29[^\n]", userIn); printf("Please enter a character to search for: "); scanf(" %c", &findChar); printf("The character you entered is: %c", findChar); return 0; }
内容的提问来源于stack exchange,提问作者David Hernandez
相关产品推荐
相关产品推荐

