C 函数中FGET的格式设置问题

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

我请求使用FGET的函数的输入。我一直遇到一个恼人的错误,程序直接跳过输入,转到第二个变量的输入。我不知道是什么问题。下面是有问题的代码。它从getchar读取,如果是'n',则进入第二个函数

#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调用未定义的行为。它每次对我都有效,但并不意味着某件事是正确的。