Как повторно запросить ввод пользователя, если пользователь ввел нецелое число - PullRequest
0 голосов
/ 10 апреля 2020

Как мне постоянно повторять запрос пользователя на ввод правильного ввода, которое является целым числом? Я знаю, как проверить ввод целочисленного диапазона, но я не знаю, как проверить нецелочисленный ввод, когда будет предложено ввести целое число в C.

#include <stdio.h>

int main() {
    int menu;
    while(true) {
        printf("Choose a menu (1-4):\n");
        do {
            scanf("%d", &menu);
        } while(menu < 1 || menu > 4);
        if(menu == 1) {
            printf("menu 1\n");
        } else if(menu == 2) {
            printf("menu 2\n");
        } else if(menu == 3) {
            printf("menu 3\n");
        } else if(menu == 4) {
            printf("menu 4, exit\n");
            break;
        }
    }
    return 0;
}

Любая помощь будет оценена, Извините, если это дубликат, так как каждый раз, когда я пытаюсь найти решение, оно на другом языке или поток спрашивает «как проверить диапазон целочисленного ввода» вместо нецелого ввода.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

, если вы хотите знать, когда пользователь ввел нецелочисленный ввод, способ сделать это можно сделать следующим образом:

char number; /* assuming you'll only need numbers 0-9 */
int menu;

while (true)
{
  scanf("%c",&number);
  if (number >= '0' && number <= '9')
     break;
  else
     printf("The input is not an integer\n");
 }

menu = number - '0' ;
/* write rest of the code here */

Если ввод от 1 до 999, вы можете используйте это:

char *s = malloc(sizeof(char)*4);

while (true)
{
  scanf("%s", s);
  is_int = true;
  menu = 0;
  if (s[3] != '\0')
  {
    printf("integer bigger than 999 not allowed, input again\n");
    continue;
  }
  for (int itr = 0; s[itr] != '\0'; itr++)
    if (s[itr] >= '0' && s[itr] <= '9')
    {
      menu = menu*10 + s[itr]-'0';
    }
    else
    {
      is_int = false;
      printf("not a valid integer, input again\n");
      break;
    }

  if (is_int && menu != 0)
  break;
}
0 голосов
/ 10 апреля 2020

Отдельный ввод от разбора.

Рассмотрим вспомогательную функцию. Используйте fgets(), чтобы прочитать, а затем проанализировать.

// return 0 on success, EOF on end of file
int read_int(const char *prompt, int min, int max, &val) {
  #define LINE_N 100
  while (1) {
    fputs(prompt, stdout);
    fflush(stdout);

    char buf[LINE_N];
    if (fgets(buf, sizeof buf, stdin) == NULL) {
      return EOF;
    }

    char *endptr;
    errno = 0;
    long val = strtol(buf, &endptr, 0);
    // Validate an integer was read and if it is in range
    if (endptr > buf && errno==0 && val >= min && val <= max) {
      return (int) val;
    }
  }
}

Использование

int menu;
if (get_int("Choose a menu (1-4):\n", 1, 4, &menu) == EOF) {
  printf("Input closed\n");
  return 0;
}

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