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

strcmp匹配含换行符字符串问题:C语言链表过滤函数求解

这个问题我之前处理过好多次,CSV读数据带换行符真的是常见坑!给你几个靠谱的解决方案,你可以根据自己的场景选:

解决方案1:提前清理节点中的换行符

这应该是最彻底的办法,毕竟后续所有操作都不用再纠结换行的问题。你可以在把CSV数据存入链表节点的阶段,就把country字段末尾的'\n'去掉。用strcspn函数特别方便,它能快速定位到第一个匹配指定字符的位置:

// 假设node->country已经分配好内存,且是从CSV读入的原始字符串
size_t newline_pos = strcspn(node->country, "\n");
node->country[newline_pos] = '\0'; // 把换行符替换成字符串结束符

处理完之后,后续直接用strcmp(node->country, country)就能正常匹配,完全不用改动你的过滤逻辑。

解决方案2:比较时忽略末尾的换行符

如果不想修改原节点的字符串(比如还要保留原始CSV数据),可以写一个自定义的比较函数,只比较到换行符或者字符串结束的位置:

int compare_country(const char *a, const char *b) {
    while (*a != '\0' && *a != '\n' && *b != '\0') {
        if (*a != *b) {
            return *a - *b;
        }
        a++;
        b++;
    }
    // 检查是否其中一个到了换行、另一个到了结束,或者两者都到了终止位置
    return ((*a == '\n' || *a == '\0') && *b == '\0') ? 0 : (*a - *b);
}

然后在过滤函数里用这个替代strcmp:

if (compare_country(node->country, country) == 0) {
    // 执行删除节点的逻辑
}
解决方案3:正确使用strstr(需注意边界)

你提到想用strstr,其实可以这么做:检查country是否是node->country的前缀,并且紧接着的字符是换行符或者字符串结束符。但要小心误匹配(比如country是"China",而node->country是"Chinese\n"),所以必须加边界检查:

const char *match = strstr(node->country, country);
// 匹配条件:
// 1. strstr找到了匹配位置,且该位置是字符串开头(避免部分匹配)
// 2. 匹配后的下一个字符是换行符或字符串结束符
if (match != NULL && match == node->country && 
    (*(match + strlen(country)) == '\n' || *(match + strlen(country)) == '\0')) {
    // 执行删除节点的逻辑
}

不过这个方案不如前两个稳妥,毕竟CSV数据偶尔会有异常格式,还是前两种方法更可靠。

另外你担心给country追加换行符的内存问题,确实没必要走这条路——如果country是字符串常量,直接修改会触发未定义行为;如果是动态分配的内存,还要考虑扩容,容易引出新的bug,完全不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:49:10