所以我练习c并且在使用fgets()时遇到这个错误。代码的第一个实例被跳过并转到下一行。
CODE
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)
答案 0 :(得分:6)
您必须小心混合使用不同的输入方法,例如scanf
和fgets
。如果您scanf("%d")
并输入一个整数后跟换行符,则指针将保留在换行符处(第一个字符对构造整数无效),所以 后面的内容{正如您所见,{1}}会接听。
例如,请考虑以下小程序:
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
行来获取所需内容,例如{ {3}}
这样,所有输入都是基于行的,你仍然可以获得sscanf
的强大功能来从行中提取数据。