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

使用strcmp比较不同长度字符数组未匹配,如何正确结合fgets使用?

fgets读取字符串后strcmp不匹配的问题分析与解决

问题原因

你输入"Pedro"后,fgets()会将输入的字符串**连同换行符\n**一起写入test数组,此时test中存储的是"Pedro\n\0",而name数组里是"Pedro\0"。两者内容存在差异,strcmp()自然不会返回0。

解决方法

核心是移除fgets()读取到的换行符,以下是两种常用方式:

方式一:使用strcspn()快速处理

strcspn()会返回字符串开头到第一个指定字符的长度,利用这一点可以直接定位换行符并替换为字符串结束符\0:

fgets(test, 25, stdin);
// 移除换行符
test[strcspn(test, "\n")] = '\0';

if(!strcmp(name, test))
   puts("They are equal...");

方式二:使用strchr()查找并替换

先通过strchr()查找换行符的位置,存在则替换为\0,逻辑更直观:

fgets(test, 25, stdin);
char *newline = strchr(test, '\n');
if (newline != NULL) {
    *newline = '\0';
}

if(!strcmp(name, test))
   puts("They are equal...");

额外注意事项

  • 建议先判断fgets()的返回值,处理读取失败(比如遇到EOF)的情况:
    if (fgets(test, 25, stdin) == NULL) {
        // 读取失败,可根据需求做错误处理
        return 1;
    }
    
  • 如果输入的字符串长度超过fgets()指定的最大可读长度(这里是24,需留一位给\0),换行符不会被读入,此时上述代码也不会出错——strcspn()会返回字符串长度,替换位置就是原有的\0,不会破坏字符串结构。

内容的提问来源于stack exchange,提问作者Pedro Luiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:31:02