2016-01-16 3 views
3

Моя программа работает нормально и все, но я хочу, чтобы она была идеальной. Поэтому я наткнулся на эту проблему, что, когда моя функция работает, она печатает один и тот же оператор printf() дважды.Программа распечатывает тот же оператор печати дважды

Позвольте мне показать вам, что я имею в виду, это то, как моя функция выглядит (пропускающие основные/прототипы)

void decision2(struct CardDeck *deck) { 
char choice; 
int Ess; 
printf("\n%s, Your have %d\n", deck->name2, deck->ValueOfSecondPlayer); 
while (deck->ValueOfSecondPlayer <= 21) 
{ 
    if (deck->ValueOfSecondPlayer == 21) { 
     printf("You got 21, nice!\n"); 
     break; 
    } 
    if (deck->ValueOfSecondPlayer < 21) { 
     printf("Would you like to hit or stand?\n"); 
     scanf("%c", &choice); 
    } 
    if (choice == 'H' || choice == 'h') { 
     printf("You wish to hit; here's your card\n"); 
     Ess = printCards(deck); 
     if (Ess == 11 && deck->ValueOfSecondPlayer > 10) 
     { 
      Ess = 1; 
     } 
     deck->ValueOfSecondPlayer += Ess; 
     printf("Your total is now %d\n", deck->ValueOfSecondPlayer); 
     if (deck->ValueOfSecondPlayer > 21) { 
      printf("Sorry, you lose\n"); 
     } 
    } 
    if (choice == 'S' || choice == 's') { 
     printf("You wished to stay\n"); 
     break; 
    } 
} 

}

Так что дело в моем коде вот странно, эта часть:

if (deck->ValueOfSecondPlayer < 21) { 
     printf("Would you like to hit or stand?\n"); 
     scanf("%c", &choice); 
    } 

выход программы становится это:

k, Your have 4 
Would you like to hit or stand? 
Would you like to hit or stand? 
h 
You wish to hit; here's your card 
6 of Clubs 
Your total is now 10 
Would you like to hit or stand? 
Would you like to hit or stand? 
h 
You wish to hit; here's your card 
King of Diamonds 
Your total is now 20 
Would you like to hit or stand? 
Would you like to hit or stand? 
s 
You wished to stay 

Как вы видите, printf печатает заявление дважды, и я не могу понять программу, если честно, поэтому я надеюсь, что у кого-то есть решение и объяснение, почему это происходит?

+1

Вы используете только один символ с% c, но для его ввода вы нажимаете ENTER, что является новым символом. Либо игнорируйте \ r и \ n, либо, возможно, используйте fgets. – LSerni

ответ

6

Проблема здесь, с

scanf("%c", &choice); 

он считывает ранее сохраненный newline (введенный во входной буфер, нажав кнопку ENTER ключ после первого входа), и выполняет еще одну итерацию. Вы должны написать

scanf(" %c", &choice); //note the space here 
     ^^ 

, чтобы избежать новой строки.

Разрабатывать, ведущее место перед %c игнорирует любое число ведущих пробелов символ (ы) [FWIW, newline является символ пробела] и ждать, чтобы получить непробельный вход.

+0

Не знаю, спасибо за ваше объяснение! –

+0

@phil_sw приветствую :) –

3

Там должен быть пробел перед %c в scanf(), чтобы очистить ранее введенный символ новой строки \n:

scanf(" %c", &choice); 

Без пространства, scanf() будет сканировать строку и снова перейти к началу цикла (после того, как пропуская оставшиеся if заявления), пропустив первый if() и распечатав "Would you like to hit or stand?\n" второй раз.

Смежные вопросы