gpt4 book ai didi

C 忽略换行符\n 使用 getline

转载 作者:行者123 更新时间:2023-12-02 14:56:24 25 4
gpt4 key购买 nike

我想使用 C 语言读入可变数量的字符串

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

函数。所以我想出了以下代码:

int main() {
int number;
char *line;
size_t len;
scanf("%d", &number);
for (int i = 0; i < number; ++i) {
line = NULL;
getline(&line, &len, stdin);
printf("%s", line);
}
}

上面代码的问题是,getline 的第一次调用读入了换行符 ('\n'),它跟在输入的数字后面,而不是第一个字符串。添加以下代码行之一(由 OPTION 1 resp. OPTION 2 表示)可解决问题:

int main() {
int number;
char *line;
size_t len;
scanf("%d", &number);
// fflush(stdin); /* OPTION 1 */
for (int i = 0; i < number; ++i) {
line = NULL;
getline(&line, &len, stdin);
// while (*line == '\n') getline(&line, &len, stdin); /* OPTION 2 */
printf("%s", line);
}
}

我的问题:

Is adding one of these lines (OPTION 1, OPTION 2) the correct way of doing this?

If so which one is to favor over the other?

If not what would be the correct way?

最佳答案

Is adding one of these lines (OPTION 1, OPTION 2) the correct way of doing this?

根据标准,选项 1 是未定义的行为,因此即使它在您的系统上工作,我也不会推荐它。

选项 2 更好,它会“吃掉”scanf 留下的 '\n',这正是您想要的。但它也会“吃掉”任何仅包含换行符的后续输入。

如果你只是想从 number 的输入中“吃掉”换行符,我可能会这样做:

int main() {
int number;
char *line = NULL;
size_t len = 0;
getline(&line, &len, stdin);
if (sscanf(line, "%d", &number) != 1)
{
// Illegal input
exit(1);
}
for (int i = 0; i < number; ++i) {
// ------------------- line = NULL; Delete this - see below
getline(&line, &len, stdin);
printf("%s", line);
}
free(line);
retur 0;
}

请注意,您只能在程序开始时将 line 设置为 NULL。在每个循环中将其设置为 NULL 会导致内存泄漏。还要注意 free(line)

关于C 忽略换行符\n 使用 getline,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52701328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com