Проблема форматирования с fgets в функции - PullRequest
1 голос
/ 02 июля 2011

Я прошу ввода от функций, использующих fgets.Я продолжаю получать досадную ошибку, из-за которой программа пропускает ввод и переходит ко второй переменной.Я понятия не имею, в чем проблема.Код в вопросе ниже.Он читает из getchar (), и если он равен 'n', он выполняет 2-ю функцию.

#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 ]

4 голосов
/ 02 июля 2011

Я не запускал твой код, поэтому могу только догадываться. Это звучит знакомо:

программа пропускает прямо над входом и идет на ввод второго переменная.

Это связано с этими вопросами:

входной поток после первого сканирования вызов по-прежнему содержит \ n , поэтому получает вызов читает это сразу, без делая паузу для ввода чего-либо Больше. Проблема в том, что получает вызов удовлетворяет потребность в вводе неожиданный путь

Так что, вероятно, где-то осталось \n.

EDIT

Я перечитал ваш код и считаю, что ваша проблема:

char choice = getchar(); /* leaves a \n in the buffer */
3 голосов
/ 02 июля 2011

Это потому, что в буфере 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.

...