为何fgets()无输出而scanf()正常?C语言代码问题求助
问题原因分析与解决方案
嘿,这个问题我当初刚学C的时候也踩过一模一样的坑!核心问题出在**fgets()和scanf("%s")对换行符的处理完全不同**:
1. 为什么fgets()版本无输出?
当你用fgets(search_for, 80, stdin)读取输入时,它会把你输入的内容连同末尾按下的回车键(也就是换行符\n)一起存入search_for数组。比如你输入town然后回车,search_for里实际存储的是:"town\n\0"。
而你的tracks数组里的所有字符串都不包含换行符,strstr()函数自然找不到匹配的子串,所以没有任何输出。
2. 为什么scanf("%79s")版本正常工作?
scanf("%79s", search_for)的行为不一样:
- 它会自动跳过输入开头的空白字符(包括换行符)
- 只读取连续的非空白字符,直到遇到空白(比如回车、空格)就停止
- 不会把末尾的换行符存入
search_for,最后自动在末尾加上字符串结束符\0
还是拿输入town举例,search_for里存储的是"town\0",和tracks里的字符串能匹配上,所以strstr()能找到结果并输出。
3. 如何修复fgets()版本的代码?
只需要在调用fgets()之后,手动去掉末尾的换行符就行。可以用strcspn()函数快速实现:
int main() { char search_for[80]; printf("Search for: "); fgets(search_for, 80, stdin); // 去掉换行符 search_for[strcspn(search_for, "\n")] = '\0'; find_track(search_for); return 0; }
strcspn(search_for, "\n")会返回search_for中第一个换行符的位置,我们把这个位置的字符替换成\0,就相当于截断了换行符,这样search_for就和scanf版本的结果一致了。
额外提醒
fgets()其实比scanf("%s")更安全,因为它能限制读取的字符数,避免缓冲区溢出;而scanf("%s")如果输入的字符超过数组长度,会导致缓冲区溢出问题。所以推荐尽量使用fgets(),然后处理掉换行符即可。
内容的提问来源于stack exchange,提问作者user2245762
相关产品推荐
相关产品推荐

