Fgets игнорируется после его запуска один раз в программировании на C? - PullRequest
0 голосов
/ 20 марта 2011

Итак, это код, он довольно простой, но почему после первого цикла запрос 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);

 }
<ч />

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

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

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

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

Я попробовал freopen, но ничего не получилось.

Ответы [ 3 ]

3 голосов
/ 20 марта 2011

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

2 голосов
/ 20 марта 2011

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

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

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

0 голосов
/ 20 марта 2011

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

См. C, для получения более подробной информации прочитайте двоичный стандарт .

...