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
相关产品推荐
相关产品推荐

