fgets() 的第一个实例被跳过
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;
}
如果你 compile/run 那个,然后输入 123 456
,你将看到的输出是:
123[ 456
]
在那里你可以看到 fgets
已经拾取了扫描整数之后的剩余行,从第一个非数字 space 到末尾的换行符。
如果单独使用 scanf
,通常没问题,因为 大多数 (但不是全部)格式说明符在读取之前会跳过前导白色 space他们的项目。
还有一些方法允许混合使用不同的输入法,例如读取 scanf
之后的字符直到换行,有效地丢弃该行的其余部分(包括换行符)。
但也许最简单的方法是使用定制的、经过验证的 line-input 函数来获取行,然后 sscanf
行来获取你想要的想要,比如this one.
这样,所有 输入都是基于行的,您仍然可以获得 scanf
从行中提取数据的能力。
所以我正在练习 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;
}
如果你 compile/run 那个,然后输入 123 456
,你将看到的输出是:
123[ 456
]
在那里你可以看到 fgets
已经拾取了扫描整数之后的剩余行,从第一个非数字 space 到末尾的换行符。
如果单独使用 scanf
,通常没问题,因为 大多数 (但不是全部)格式说明符在读取之前会跳过前导白色 space他们的项目。
还有一些方法允许混合使用不同的输入法,例如读取 scanf
之后的字符直到换行,有效地丢弃该行的其余部分(包括换行符)。
但也许最简单的方法是使用定制的、经过验证的 line-input 函数来获取行,然后 sscanf
行来获取你想要的想要,比如this one.
这样,所有 输入都是基于行的,您仍然可以获得 scanf
从行中提取数据的能力。