在函数中使用fgets格式化问题

时间:2011-07-02 08:10:40

标签: c formatting fgets

我要求使用fgets从函数输入。我不断收到一个烦人的错误,程序跳过输入并转到第二个变量的输入。我不知道这似乎是什么问题。有问题的代码如下。它从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();
}
输出

(不是整个输出):

>n
>name: age: 

现在可以使用

printf("name: ");
while(getchar()!='\n');

fgets(name, 20, stdin);

2 个答案:

答案 0 :(得分:4)

我没有运行你的代码所以我只能猜测。这听起来很熟悉:

  

程序跳过输入   并转到第二个输入   变量

与这些问题有关:

  

第一次扫描后的输入流   呼叫仍然包含\ n ,所以   得到电话立刻读取它,没有   暂停你输入任何东西   更多。问题在于获得   呼叫满足其输入的需要   一种意想不到的方式

所以它可能是某个地方的剩余\n

修改

我重新阅读了您的代码,我相信您的问题是:

char choice = getchar(); /* leaves a \n in the buffer */

答案 1 :(得分:3)

那是因为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();
}

<强>被修改

因为,这里的每个人都说不鼓励使用fflush(stdin);(虽然它每次都适合我。:)) 这是另一种解决方案。而不是fflush(stdin)使用:

while(getchar()!='\n');

这将清空可能跳过下一个fgets调用的换行缓冲区。