C - переменная scanf, пока она не является целым числом - PullRequest
0 голосов
/ 17 марта 2020

Я хочу, чтобы моя функция читала мою переменную, пока она не является целым числом. Мой учитель научил нас делать это, используя форму var=scanf("%d", &x), и если это строка, она будет равна нулю. Тем не менее, когда я ввожу строку, время l oop повторяется без запроса повторного ввода значения.

Вот мой алгоритм:

int returnValue(int a, int b)
{
    int x, r;
    do{
        printf("Enter a value between %d and %d.\n", a, b);
        r=scanf("%d", &x);
    }while(x<a || x > b || r==0);
    return x;
}

Если кто-то имеет представление о проблема, это было бы здорово.

1 Ответ

2 голосов
/ 17 марта 2020

, в то время как l oop повторяется без запроса повторного ввода значения.

Не числовой вход c, который не был преобразован в int, остается в stdin для следующей операции ввода / вывода. Один и тот же ошибочный ввод читается снова каждый l oop в коде OP. Код должен читать и отбрасывать нечисловой c ввод.

Я рекомендую не использовать scanf(), пока не узнаете, почему это плохо.
Тем временем используйте fgets() для чтения строка пользовательского ввода.

int returnValue(int a, int b) {
  char buf[40];  // Suggest a size twice the expected max.
  int x, r;
  do {
    printf("Enter a value between %d and %d [inclusive].\n", a, b);
    if (fgets(buf, sizeof buf. stdin) == NULL) {
      fprintf(stderr, "End-of-file or input error\n");
      return INT_MIN;  // Or some other invalid value.    
    }
    int r = sscanf(buf, "%d", &x);  // or look into strtol() as a more robust solution
  } while(r != 1 || x < a || x > b); // test r first else x is undefined.
  return x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...