我想使用
读取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);
}
}
我的问题:
是否添加这些行之一(
OPTION 1, OPTION 2
)的正确方法?如果这样的话,哪个会比另一个更受欢迎?
如果不是,那是正确的方法吗?
答案 0 :(得分:1)
添加这些行之一(选项1,选项2)是执行此操作的正确方法吗?
根据标准,OPTION 1是未定义的行为,因此即使它在您的系统上可以正常工作,我也不推荐它。
选择2更好,它将“吃掉”您想要的'\n'
留下的scanf
。但是它也会“吃掉”仅由换行符组成的任何后续输入。
如果您只是想从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)
答案 1 :(得分:0)
问题出在scanf
上。
scanf("%d", &number);
您正在从stdin
中读取一个整数。但是,通过按Enter键,它会在输入末尾自动添加“ \ n”。
因此,scanf
完成后,标准输入中就会剩下"\n"
。
看看这一点,它提供了更多详细信息:Remove \n after scanf() which read integer
要摆脱scanf
之后的新行,一种简单的解决方案是在格式字符串的末尾添加“ \ n”:
int main() {
int number;
char *line;
size_t len;
scanf("%d\n", &number);
for (int i = 0; i < number; ++i) {
line = NULL;
getline(&line, &len, stdin);
printf("%s", line);
}
}
扫描一个整数,后跟可选的空格。