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

C语言使用getline读取字符串后无法正确去除末尾换行符问题求助

问题排查与修复方案

根因定位

  • 换行符处理逻辑有遗漏:WSL环境下如果操作的是Windows生成的文本文件,换行符是\r\n两个连续字符,原有代码仅将末尾的\n替换为\0,字符串末尾还残留了\r字符,因此看起来没有达到移除换行的预期效果。
  • 内存分配不符合C字符串要求:你为line_rev申请内存时只分配了chars_read个字节,没有预留字符串终止符\0的存储空间,会导致内存越界,引发strcmp比较结果异常、程序崩溃等未定义行为。

修复方案

调整换行处理逻辑,兼容LF和CRLF两种换行格式,同时修正内存分配长度:

void foo(FILE *input, FILE *output) {
    char *line = NULL;
    size_t length = 0;
    ssize_t chars_read;

    while ((chars_read = getline(&line, &length, input)) != -1) {
        // 处理LF换行
        if (chars_read > 0 && line[chars_read - 1] == '\n') {
            line[chars_read - 1] = '\0';
            chars_read--;
            // 追加处理CRLF换行的\r
            if (chars_read > 0 && line[chars_read - 1] == '\r') {
                line[chars_read - 1] = '\0';
                chars_read--;
            }
        }
        // 多分配1字节存储字符串终止符\0
        char *line_rev = malloc(chars_read + 1);
        // 增加malloc失败校验,避免空指针异常
        if (!line_rev) {
            perror("malloc failed");
            break;
        }
        bar(line, line_rev, chars_read);
        if (strcmp(line, line_rev) == 0) {
            // 原有逻辑
        } else {
            // 原有逻辑
        }
        free(line_rev);
    }

    free(line);
}

额外注意事项

WSL跨环境开发时要注意文本文件的换行符差异:Windows原生文本文件用\r\n(CRLF)作为换行符,Linux原生文本文件用\n(LF)作为换行符,处理字符串前要确认目标文件的换行格式,避免逻辑遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:24:03