Функция Gets(string#) пропускает первый запрос на получение

Я работаю над проектом для личного досуга и обучения. Часть выглядит так:

 #include<stdio.h>
 #include<string.h>
 wgame()
 {
 char string3[12], string2[12], string1[12], string4[12], string5[12];
 memset (string1, 0, 11);
 memset (string2, 0, 11);
 memset (string3, 0, 11);
 memset (string4, 0, 11);
 memset (string5, 0, 11);
 printf("reference C correct\n");
 printf("Okay, so you want a game. Here's one for you\n\n\n");
 printf("This is a word game.\n\n   A noun is a person place or thing.\n   A verb is 
 something that you can get up and do.\n   A subject is what the conversation is about.\n");
 printf("Go ahead, type a subject:\n");
 gets(string3);
 printf("That's a good one. Now, type a verb:\n");
 gets(string2);
 printf("How about another:\n");
 gets(string4);
 printf("Really? Okay. Now, type in a noun:\n");
 gets(string1);
 printf("Cool. How about typing another noun:\n");
 gets(string5);
 printf("Allright, here's how your words fit into this game:\n\n\n\n\n");
 printf("When the %s was %s the %s %s all the other %s", string1, 
 string2, string3, string4, string5);
 return 4;

 }

Моя проблема в том, что вывод пропускает первое "gets(string#)" и переходит к следующему "printf()". Может кто-нибудь сказать мне, почему это так?


person Michael O'hearn    schedule 29.08.2011    source источник
comment
wgame() должно быть int wgame(void). Никогда не используйте gets(); его нельзя безопасно использовать, и он удаляется из языка. Используйте осмысленные имена переменных. Избегайте магических чисел (11, 12). Отступ вашего кода.   -  person Keith Thompson    schedule 29.08.2011


Ответы (2)


Вполне вероятно, что перед wgame вы выполняете некоторые scanf, которые оставляют \n в буфере stdio.

Вот несколько вещей, которые вы должны сделать:

  • Не смешивайте scanf и gets
  • Не используйте gets. Используйте fgets
  • Не слушайте людей, предлагающих fflush(stdin). Это неправильно.

С большой осторожностью и умеренностью вы можете использовать:

/* Right before `wgame` begins. */
while((c = getchar()) != '\n' && c != EOF)
    ;

Однако имейте в виду, что его следует использовать экономно, игнорирование пользовательского ввода опасно.

Прочтите этот Часто задаваемые вопросы по C по этому вопросу, а также объяснение об очистке stdin.

person cnicutar    schedule 29.08.2011

person    schedule
comment
Возможно, вы захотите объяснить, что вы здесь делаете, для людей, которые столкнутся с аналогичными проблемами в будущем :) - person Neograph734; 17.12.2012