[英]fgets()'s first instance is being skipped
因此,我正在练习c并在使用fgets()时遇到此错误。 代码的第一个实例将被跳过并转到下一行。
码
for(g = 0;g<numStudents;g++)
{
array->firstName = malloc(sizeof(char)*BUFSIZE);
array->lastName = malloc(sizeof(char)*BUFSIZE);
printf("Student %d\n", g+1);
printf("First Name:");
fgets(array->firstName, BUFSIZE, stdin);
printf("Last Name:");
fgets(array->lastName, BUFSIZE, stdin);
printf("\n\n");
}
我在本节之前使用scanf(),所以我发现必须刷新缓冲区。 但是,这是行不通的。
输出通常为:
Student 0
First Name:Last Name:(Cursor)
您必须小心混合使用不同的输入法,例如scanf
和fgets
。 如果您scanf("%d")
然后输入一个整数,后面跟一个换行符,指针将在新行(第一个字符不是有效的构建一个整数)留下,所以这是一个下列fgets
将回暖,如你可以看到。
例如,考虑以下小程序:
#include <stdio.h>
int main (void) {
int val;
char buffer[100];
scanf ("%d", &val);
fgets (buffer, sizeof(buffer), stdin);
printf ("%d[%s]\n", val, buffer);
return 0;
}
如果您编译/运行该代码,请输入123 456
,您将看到的输出是:
123[ 456
]
在那里,您可以看到fgets
拾取了扫描的整数之后的其余行,从第一个非数字空格到最后的换行符。
如果单独使用scanf
,通常没问题,因为大多数 (但不是全部)格式说明符在读取项目之前会跳过前导空格。
还有一些方法可以混合使用不同的输入法,例如在scanf
之后读取字符,直到获得换行符为止,从而有效地丢弃了其余行(包括换行符)。
但是,最简单的方法也许是使用定制的,经过验证的行输入函数来获取行,然后对这些行进行sscanf
以获取所需的内容,例如本例 。
这样, 所有输入都是基于行的,您仍然可以获得scanf
从行中提取数据的能力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.