从使用 getline() 读入的字符串中删除“\n”时出现问题

Problem with removing the "\n" from a string read in with getline()

你好,我是 C 编程语言的新手,我正在用 C 编写我的第一个程序。我想从使用 getline() 读入的行的末尾删除“\n”并将其替换为“\0”。我用 if 语句中的代码尝试了它,这是我的 while 循环中的第一个表达式,但我没有得到我想要的行为。 我尝试了此处建议的解决方案 Function to remove newline has no effect? 但它对我的情况不起作用,我不明白为什么,我认为我在使用指针时犯了错误,但我无法弄清楚它是什么。我到底做错了什么,我该如何解决?

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) {
        if (line[chars_read-1] == '\n') {
            line[chars_read-1] = '[=10=]';
            chars_read = chars_read - 1;
        }
        char *line_rev = malloc(sizeof(char)*chars_read);
        bar(line, line_rev, chars_read);
        if (strcmp(line, line_rev) == 0) {
            ...
        } else {
            ...
        }
        free(line_rev);
    }

    free(line);
}

更新:感谢所有有用的答案!对于未来的访问者:在 WSL 上工作时要小心,新行可能是 '\n' 或 '\r' 取决于你正在工作的 OS 。有关详细信息,请查看 Ted 的回答 ;)。

您只需在 \n 所在的位置放置一个 [=11=]

它可能看起来像这样;

char *line = NULL;
size_t length = 0;
ssize_t chars_read;
// ...

    if(chars_read > 0 && line[chars_read-1] == '\n') {
        line[chars_read-1] = '[=10=]';
        // special care for windows line endings:
        if(chars_read > 1 && line[char_read-2] == '\r') line[chars_read-2] = '[=10=]';
    }

字符串 中的潜在 '\n' 替换为 '[=14=]':

 line[strcspn(line, "\n")] = '[=10=]';

利用先验长度chars_read:

 if (chars_read > 0 && line[chars_read - 1] == '\n') {
   line[--chars_read] = '[=11=]';
 }
   
 

malloc() 1 对于 OP 的需要来说太短了。

    // char *line_rev = malloc(sizeof(char)*chars_read);
    char *line_rev = malloc(sizeof(char)*(chars_read + 1));
    bar(line, line_rev, chars_read);
    if (strcmp(line, line_rev) == 0) {