C语言中检测scanf输入内容的换行符失败问题求助
C语言scanf读取输入无法检测到换行符的问题说明
核心原因
你用scanf("%s", userInput)读取输入时,%s格式符的读取规则是遇到空白字符(空格、制表符、换行符都属于空白字符)就自动停止读取,且会把触发停止的空白字符留在标准输入缓冲区中,根本不会写入你传入的userInput数组里,所以你遍历数组永远找不到\n字符。
你当前代码存在的其他问题
- 参数写法错误:
scanf("%s", &userInput);中userInput本身就是字符数组的首地址,不需要加取地址符&,正确写法为scanf("%s", userInput); - 存在无限循环和数组越界风险:你的for循环没有设置终止条件,变量
i会持续递增超出userInput的20个元素长度,访问非法内存会触发未定义行为,大概率会导致程序崩溃 %s无长度限制:当前写法如果用户输入超过19个字符(最后要留一个位置存字符串终止符\0),会直接溢出userInput数组,存在安全隐患,可以改成scanf("%19s", userInput)限制读取长度
解决方案
如果需要读取完整的一行输入(包含换行符),不要使用%s读取,改用fgets函数,fgets会将读取到的换行符一起存入目标数组中,示例代码如下:
_Bool read_sequence(char s[]) { int i = 0; char userInput[20]; int seq_len = 20; printf("Enter a sequence of length %d: \n", seq_len); // 用fgets读取整行,包含换行符 fgets(userInput, sizeof(userInput), stdin); for (i = 0; userInput[i] != '\0'; i++) // 遍历到字符串终止符就停止,避免越界 { if (userInput[i] == '\n') { printf("yay!"); // 现在可以正常触发 } printf("ASCII value of %c = %d\n", userInput[i], userInput[i]); } // 后续逻辑自行补充 }
如果坚持要用scanf读取,也可以在scanf执行完后调用getchar()读取滞留在缓冲区里的换行符,但这种方式只能读到单个换行,无法处理用户输入中间有空白的场景。
内容的提问来源于stack exchange,提问作者jamesandthegiantnectarine
相关产品推荐
相关产品推荐

