【发布时间】:2018-04-16 19:59:37
【问题描述】:
我在使用 stdin 缓冲区时遇到问题,如果有任何见解,我将不胜感激,我有这个函数可以接受用户输入的姓氏
void lastName(int *counter, User *pt) {
for (int i = *counter; i < (*counter + 1); i++) {
pt[i].lastName = calloc (MAX_LENGTH, sizeof(char));
printf("Enter Last Name: ");
fgets(pt[i].lastName, MAX_LENGTH, stdin);
strtok(pt[i].lastName, "\n");
}
}
我也有这个函数,接受用户输入的 ID
void id(int *counter, User *pt) {
char num[MAX_LENGTH];
long temp;
for (int i = *counter; i < *counter + 1; i++) {
printf("Enter the ID of %s: ", pt[i].firstName);
fgets(num, MAX_LENGTH, stdin);
strtok(num, "\n");
temp = strtol(num, NULL, 10);
pt[i].id = (int) temp;
}
}
这就是我在 main 中调用它们的方式
lastName(&counter, pt);
id(&counter, pt);
如果我输入一个很长的姓氏,它会被剪切并显示为 MAX_LENGTH,但 ID 的 fgets 会被跳过,否则它可以正常工作。我想知道我的 fgets 在这种情况下是如何工作的? MAX_LENGTH 为 10。我尝试使用 while(getchar() != '\n'); 清除缓冲区它可以工作,但我必须按两次回车。
Enter First Name: Test
Enter Last Name: Williamsamsmases
Enter the ID of Test: Would you like to enter a User?(Y/N):N
【问题讨论】:
-
它没有被跳过。它正在吃掉上一个调用尚未完成的任何东西。
-
如果您输入的行长于目标缓冲区可以容纳的长度,那么
fgets将读取它所能读取的所有内容,直到目标缓冲区已满。输入的其余部分保留在输入缓冲区中,因此下一个fgets调用会读取留下的内容。 -
你推荐一些东西来清除缓冲区吗? fflush(stdin) 似乎对我不起作用, fseek(stdin, 0, SEEK_END)
-
fflush(stdin)是未定义的行为。你可以getchar直到遇到\n。 stackoverflow.com/questions/7898215/… -
stdin不是可搜索的流,您不能将fseek与stdin一起使用