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

C语言中使用strcmp函数遇到问题求助

嘿,我之前处理CSV文件时也踩过strcmp匹配失败的坑,大概率是字符串里藏着你没注意到的细节,给你几个具体的排查和解决方向:

1. 最常见的坑:行尾的换行/回车符

如果你用fgets()读取CSV行,它会把换行符\n(Windows下还有回车符\r)也读进字符串里。这时候你的目标字符串是"Mark Zuckerberg",但读取到的行实际是"Mark Zuckerberg\n"或者"Mark Zuckerberg\r\n",strcmp是严格匹配,自然会返回非0。

解决办法是读取行后先清理这些隐藏字符:

char line[256];
int queue_size = 0;
FILE *fp = fopen("celebrities.csv", "r");

if (fp == NULL) {
    // 处理文件打开失败
    return 1;
}

while (fgets(line, sizeof(line), fp) != NULL) {
    queue_size++;
    
    // 去掉换行符
    char *newline = strchr(line, '\n');
    if (newline) {
        *newline = '\0';
    }
    // 去掉Windows下的回车符
    char *carriage = strchr(line, '\r');
    if (carriage) {
        *carriage = '\0';
    }
    
    // 现在再做匹配
    if (strcmp(line, "Mark Zuckerberg") == 0) {
        printf("匹配成功,行数:%d\n", queue_size);
        // 这里保存queue_size到变量/文件
    }
}
fclose(fp);

2. CSV字段的前后空白

有些CSV文件里的姓名可能被空格包裹,比如" Mark Zuckerberg "或者"Mark Zuckerberg ",这也会导致strcmp匹配失败。如果需要忽略前后空白,可以写个简单的trim函数处理:

#include <ctype.h>

char* trim(char *str) {
    // 跳过开头的空白字符
    while (isspace((unsigned char)*str)) {
        str++;
    }
    if (*str == '\0') {
        return str;
    }
    // 从末尾往前跳过空白
    char *end = str + strlen(str) - 1;
    while (end > str && isspace((unsigned char)*end)) {
        end--;
    }
    // 截断字符串
    *(end + 1) = '\0';
    return str;
}

然后在匹配前调用trim(line):

if (strcmp(trim(line), "Mark Zuckerberg") == 0) {
    // 处理匹配逻辑
}

3. 计数器的时机问题

确认你的queue_size是在读取该行之后才递增的。如果是先递增再读行,那匹配到的行数会比实际多1;如果是读行后没递增就匹配,那行数会少1。像上面代码里那样,fgets成功读取后立刻queue_size++,这个时机是对的。

额外检查:字符串截断问题

如果你的line数组太小,读取长行时会被截断,导致匹配失败。确保line的大小足够容纳CSV里最长的姓名行(比如设成512或1024字节)。

试一下这些方法,应该能解决你的问题!

内容的提问来源于stack exchange,提问作者Brian.H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:41:05