Подтвердите ввод и еще раз спросите, если неверно - PullRequest
0 голосов
/ 23 ноября 2018

В этом коде у меня есть несколько запросов для пользовательского ввода.Если вместо 4 введен неверный ввод, например, 'r', я хочу, чтобы моя программа произнесла "неверный ввод" и запросила другой ввод пользователя.Я много пробовал, но не смог заставить его работать.Я прокомментировал проблемные места в коде.Спасибо за помощь.

#include <stdio.h>

int main()
{ 
double Operand1;
double Operand2;
int Menuchoice; 
int Input;
char Dummy;
double Result;

do
{

  printf("Simple Calculator\n");
  printf("========================\n");
  printf("\n");
  printf("1. Addition\n");
  printf("2. Subraction\n");
  printf("3. Multiplication\n");
  printf("4. Division\n");
  printf("9. Quit\n");


  Input = scanf("%i", &Menuchoice);  // At this point I want to check if there is a valid input and 
  do scanf("%c", &Dummy);            //  if not the programm should ask again
  while (Dummy != '\n');

  if(Input)
  {
     switch(Menuchoice)
     {
        case 1: printf("Type in the first operand:\n");
                scanf("%lf", &Operand1)                     // Here I want to validate the input         
                printf("Type in the second operand:\n");    // again and the programm should also ask 
                scanf("%lf", &Operand2)                     // again if it was invalid
                printf("%lf + %lf = %lf\n", Operand1, Operand2, Result);
                break;
        case 2: 
        case 3: 
        case 4: 
        default: printf("No valid input!\n");
                break;
     }
  }

}while (Menuchoice != 9);

 return 0;
}

1 Ответ

0 голосов
/ 23 ноября 2018

Страница справочника scanf:

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

Итак, вот пример, который может привести вас к решению вашей проблемы:

#include <stdio.h>

int main (int argc, char* argv)
{
  double o;
  int res;

  // To illustrate, I chose to set up an infinite loop.
  // If the input is correct, we'll "break" it
  while(1)
    {
      printf("Enter a double: ");
      res = scanf("%lf",&o);

      // Success = 1 read input
      if (res == 1)
      {
        printf("Yahoo, got it right: %f\n",o);
        break; // We exit the loop
      }

      // Ah, we failed
      printf("Please retry.\n");
      // popping the CR character to avoid it to be got by the next scanf()
      getchar();

      // Here we go for another loop.
    }

    // Good, we got our double.
    printf("Hey, sounds like we got outside this infinite loop.\n");
}

Пример:

user@so:~$ ./a.out 
Enter a double: r
Please retry.
Enter a double: f
Please retry.
Enter a double: 6.543
Yahoo, got it right: 6.543000

Имейте в виду, что эта проверка не идеальна.Например, "frg6sgg" будет успешным и будет отображаться как 6.0000000 на printf().

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