C - scanf () принимает два входа вместо одного - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу программу, которая имитирует бросание костей, и я застрял с этим фрагментом кода:

short diceNumber(){
unsigned short dice;
do {
    printf("\nInput the number of dice to roll: ");
    if(!scanf("%hu", &dice)) {
        scanf("%*[^\n]");
        scanf("%*c");
        puts("");
        puts("WRONG INPUT!");
    }
    else if(dice <= 0) puts("YOU MUST USE A DICE AT LEAST!");
}while(!scanf("%hu", &dice)|| dice <= 0);

return dice; 
}

Проблема в том, что "scanf" внутри оператора if принимает два ввода вместоодин, например:

Input the number of dice to roll: 2

Затем он снова хочет 2 (или другое число).Первый вход не сканируется.Но ранее, в другой функции, «то же самое» утверждение работает.Вот код:

void menu () {

unsigned short myAnswer;

puts("Choose the dice type");
puts("");
// A printf statement with all the options
puts("");

do {

    // INPUT VALIDATION SECTION

    printf("\nYour input: ");
    if (!scanf("%hu", &myAnswer)) {
        scanf("%*[^\n]");
        scanf("%*c");
        puts("");
    }
// switch statement
} while (myAnswer < 1 || myAnswer > 17);
}

Я пробовал разные решения (например, fputs, fflush (stdin), fflush (stdout)), но никто не работал.Можете ли вы помочь мне?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Проблема в том, что "scanf" внутри оператора if принимает два ввода вместо одного

Нет.Верхний код имеет набор 3 scanf() и еще один 4 scanf().Именно четвертое приводит к тому, что «берет два входа вместо одного».

Идея 3 scanf() имеет смысл, даже если она необычна, читать unsigned short.

Чтобы исправить код и по-прежнему использовать идею:

int diceNumber(void) {
  unsigned short dice;
  for (;;) {
    printf("\nInput the number of dice to roll: ");
    fflush(stdout); // insure output is seen 
    int count = scanf("%hu", &dice);
    if (count == 1) {
      if (dice <= 0) puts("YOU MUST USE A DICE AT LEAST!");
      else break;
    } else if (count == EOF) {  // This case omitted in original code.
      return EOF;  
    }
    scanf("%*[^\n]");  // consume almost all of rest of line
    scanf("%*c");      // consume rest of line (expected \n)
    puts("");
    puts("WRONG INPUT!");
    // if(dice <= 0) not possible for unsigned short
  }
  return (int) dice;  
}
0 голосов
/ 01 февраля 2019

Вы не должны иметь scanf в операторе while.Это заставляет пользователя вводить новый номер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...