You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:31:56