问题描述
当我在循环中使用fgets时,它将前一个工作的enter命令作为输入并对其进行处理,这不仅发生在fgets中,而且在许多其他情况下也发生在我身上,所以我的问题是....
1。是否可以在开始任何循环时停止前面的工作命令?
2。如果不是,请告诉我如何解决此问题?
程序
#include <stdio.h>
#include <strings.h>
struct student
{
char name[10];
}st[10];
int main()
{
int i,j;
printf("enter the number of students=");
scanf("%d",&i);
j=i;
for (i=1;i<=j;i++)
{
printf("enter the student's name= ");
fgets(st[i].name,sizeof(st[i]),stdin);
printf("%s",st[i].name);
}
}
输出
enter the number of students=2
enter the student's name=
enter the student's name= hello
hello
请参阅此处,它从第二行开始输入,即,将第一输入作为回车键并移至第二输入
解决方法
您可以通过使用fflush刷新标准输入缓冲区来做到这一点...请参见下面的代码:
#include <stdio.h>
#include <strings.h>
struct student
{
char name[10];
}st[10];
int main()
{
int i,j;
printf("enter the number of students=");
scanf("%d",&i);
j=i;
for (i=1;i<=j;i++)
{
fflush(stdin); // flush the stdin buffer
printf("enter the student's name= ");
fgets(st[i].name,sizeof(st[i]),stdin);
printf("%s",st[i].name);
}
return 0;
}
输出为:
enter the number of students=2
enter the student's name= hello
hello
enter the student's name= world
world
使用fflush(stdin)的问题:
尽管fflush(stdin)
有效,但实际上并不是完美的解决方案。 fflush(stdin)有一些潜在的问题。请看看here。而且在online gdb
的情况下,fflush(stdin)根本无法工作。
因此,我提出了一种替代解决方案。它可以在online gdb
和您的本地计算机中完美运行:
问题是末尾输入数字的uneaten '\n'
。它保存在stdin
的缓冲区中。所以,我们只需要吃它。因此,我们将只编写一个scanf("%d%c",&i,&uneaten_newline_char)
。完整代码:
#include <stdio.h>
#include <strings.h>
struct student
{
char name[10];
} st[10];
int main()
{
char uneaten_newline_char;
int i,j;
printf("enter the number of students=");
scanf("%d%c",&uneaten_newline_char); // notice,there's no space between '%d%c',they must be written without any space between them
j=i;
for (i=1;i<=j;i++)
{
// fflush(stdin); // flush the stdin buffer
printf("enter the student's name= ");
fgets(st[i].name,stdin);
printf("%s",st[i].name);
}
return 0;
}
此解决方案可能看起来有些丑陋...但这比使用fflush(stdin)
更好。但是对我来说,最美丽,最完美的解决方案是使用您自己的阅读器功能。创建自己的readline函数。并根据需要在最后处理空格和换行符。在这种情况下,c
的内置函数肯定不是很好。
使用fflush(“ stdin”);在fgets之前 它将清除包含“ enter”或“ / n”的输入缓冲存储器。 因为,scanf的行为是在遇到空间后停止接受输入。 因此它将“ enter”或“ / n”留在缓冲存储器中。