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

