从使用 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) {
你好,我是 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) {