C 函数中FGET的格式设置问题
我请求使用FGET的函数的输入。我一直遇到一个恼人的错误,程序直接跳过输入,转到第二个变量的输入。我不知道是什么问题。下面是有问题的代码。它从getchar读取,如果是'n',则进入第二个函数C 函数中FGET的格式设置问题,c,formatting,fgets,C,Formatting,Fgets,我请求使用FGET的函数的输入。我一直遇到一个恼人的错误,程序直接跳过输入,转到第二个变量的输入。我不知道是什么问题。下面是有问题的代码。它从getchar读取,如果是'n',则进入第二个函数 #include <stdio.h> void enter(){ char name[20]; int Age; float Highbp; float Lowbp; printf("name: "); fgets(name, 20, stdin); p
#include <stdio.h>
void enter(){
char name[20];
int Age;
float Highbp;
float Lowbp;
printf("name: ");
fgets(name, 20, stdin);
printf("age: ");
scanf("%d", &Age);
printf("high bp: ");
scanf("%f", &Highbp);
printf("low bp: ");
scanf("%f", &Lowbp);
return ;
}
void option(){
char choice = getchar();
if(choice == 'n'){
enter();
}
}
int main(int argc, char **argv)
{
option();
}
现在可以了
printf("name: ");
while(getchar()!='\n');
fgets(name, 20, stdin);
我没有运行你的代码,所以我只能猜测。这听起来很熟悉: 程序直接跳过输入 然后转到第二个的输入 变数 它与这些问题有关: 第一次扫描后的输入流 调用仍然包含一个\n,因此 获取呼叫,立即读取,无需 暂停以便您输入任何内容 更多问题是,这个问题得到了解决 调用满足其在中输入的需要 出人意料的方式 所以它可能是某个地方的一些剩余\n 编辑 我重新阅读了您的代码,我相信您的问题是:
char choice = getchar(); /* leaves a \n in the buffer */
我没有运行你的代码,所以我只能猜测。这听起来很熟悉: 程序直接跳过输入 然后转到第二个的输入 变数 它与这些问题有关: 第一次扫描后的输入流 调用仍然包含一个\n,因此 获取呼叫,立即读取,无需 暂停以便您输入任何内容 更多问题是,这个问题得到了解决 调用满足其在中输入的需要 出人意料的方式 所以它可能是某个地方的一些剩余\n 编辑 我重新阅读了您的代码,我相信您的问题是:
char choice = getchar(); /* leaves a \n in the buffer */
这是因为stdin缓冲区中缓冲了一个换行符。要删除它,请使用:
fflush(stdin);
因此,您的代码如下所示:
#include <stdio.h>
void enter(){
char name[20];
int Age;
float Highbp;
float Lowbp;
printf("name: ");
fflush(stdin);
fgets(name, 20, stdin);
printf("age: ");
scanf("%d", &Age);
printf("high bp: ");
scanf("%f", &Highbp);
printf("low bp: ");
scanf("%f", &Lowbp);
return ;
}
void option(){
char choice = getchar();
if(choice == 'n'){
enter();
}
}
int main(int argc, char **argv)
{
option();
}
这将清空新行的缓冲区,该新行可能会跳过下一个fgets调用。这是因为stdin缓冲区中有一个新行缓冲区。要删除它,请使用:
fflush(stdin);
因此,您的代码如下所示:
#include <stdio.h>
void enter(){
char name[20];
int Age;
float Highbp;
float Lowbp;
printf("name: ");
fflush(stdin);
fgets(name, 20, stdin);
printf("age: ");
scanf("%d", &Age);
printf("high bp: ");
scanf("%f", &Highbp);
printf("low bp: ");
scanf("%f", &Lowbp);
return ;
}
void option(){
char choice = getchar();
if(choice == 'n'){
enter();
}
}
int main(int argc, char **argv)
{
option();
}
这将清空新行的缓冲区,该新行可能会跳过下一个fgets调用。刷新stdin是非标准的!很有可能它实际上不起作用,它不应该起作用。但是这个想法是正确的,也就是说,找到一种方法来摆脱仍然保留在stdin中的新行。也许可以用while getchar!=EOF;在第一个getchar之后和下一个stdin读数之前;它将消耗所有已经给出的输入。@ShinTakezou不,像这样丢弃输出是危险的。请看我答案中的链接。同意sstdin上fflush的错误用法,我的意思是刷新输入的想法是好的,方法是错误的;或者你的意思是直到有输入是危险的,才消费输入?它是,如果输入是一个无穷无尽的流,循环将永远持续。。。但事实并非如此,希望……这个答案是错误的。调用fflushstdin调用未定义的行为。它对我来说每次都是有效的,但这并不意味着某些东西是正确的。刷新标准是非标准的,而且!很有可能它实际上不起作用,它不应该起作用。但是这个想法是正确的,也就是说,找到一种方法来摆脱仍然保留在stdin中的新行。也许可以用while getchar!=EOF;在第一个getchar之后和下一个stdin读数之前;它将消耗所有已经给出的输入。@ShinTakezou不,像这样丢弃输出是危险的。请看我答案中的链接。同意sstdin上fflush的错误用法,我的意思是刷新输入的想法是好的,方法是错误的;或者你的意思是直到有输入是危险的,才消费输入?它是,如果输入是一个无穷无尽的流,循环将永远持续。。。但事实并非如此,希望……这个答案是错误的。调用fflushstdin调用未定义的行为。它每次对我都有效,但并不意味着某件事是正确的。