Fgets игнорируется после его запуска один раз в программировании на C?

Итак, это код, он довольно прост, но почему fgets не появляется снова после первого цикла? и возраст есть. (И странно, это работает с scanf("%s",&name_temp), но мне нужно захватывать и другие символы, такие как áéíóúÇ, пробелы, поэтому было бы лучше с fgets)

 int menu_option = 0;
 char name_temp[80] = "";
 int age_temp = 0;

 while(menu_option != 9){

     //strcpy(name_temp,"");

     printf("Type your name\n");
     fgets(name_temp, 80, stdin);

     printf("\nType your age\n");
     scanf("%d", &age_temp);

 }

(перенесено из удаленного ответа)

Ребята, спасибо за ваши ответы, но я не думаю, что вы, ребята, поняли мой вопрос, проверьте этот код, который я отправил, и вы увидите, что вместо того, чтобы в Терминале отображалась вещь, которую вы должны ввести, она просто игнорируется после первого пока цикл.

Я хотел, чтобы после первого цикла (в то время как) он возвращался и снова запрашивал имя человека, и человек, использующий программу, должен был печатать снова. но вместо этого, после первого раза цикла, он просто не просит вас ничего печатать, fgets полностью игнорируется.

Пожалуйста, попробуйте код и скажите, что я могу сделать.

Я пробовал freopen и не работал.


person Grego    schedule 20.03.2011    source источник
comment
Вам не нужно ставить [ОЧЕНЬ ПРОСТОЙ ВОПРОС] после вашего вопроса.   -  person The Communist Duck    schedule 20.03.2011
comment
@user: обратите внимание, что уценка делает различие в форматировании между кавычками (с использованием > ) и блоками кода (с использованием четырех пробелов), и обратите внимание, что программисты считают регистр частью написания идентификаторов, поэтому Fgets не то же самое, что fgets.   -  person dmckee --- ex-moderator kitten    schedule 20.03.2011
comment
Вы не должны принимать ответ, который не сработал   -  person M.M    schedule 16.10.2014


Ответы (3)


Вы должны открыть stdin в двоичном режиме. Используйте freopen(NULL, "rb", stdin) для этого.

Дополнительные сведения см. в разделе C read binary stdin.

person Mihran Hovsepyan    schedule 20.03.2011

Когда я запускал его, он действительно печатал «Введите свое имя» каждый раз в цикле, но не ждал ввода, потому что получал «\ n», который вызов scanf оставил во входном потоке. Это распространенная проблема; одно из решений — вставить getchar(); в нижней части цикла, чтобы съесть эту новую строку.

person K. P. MacGregor    schedule 20.03.2011

fgets читать строку, то есть читать stdin до тех пор, пока не будет достигнут \n символ.

scanf оставил символ \n в stdin.

Затем fgets прочитать пустую строку.

person BenjaminB    schedule 20.03.2011
comment
Я не думаю, что это то, о чем спрашивает ОП. - person Mihran Hovsepyan; 20.03.2011
comment
@MihranHovsepyan Мне кажется, что именно в этом его проблема - person M.M; 16.10.2014