C 如果用户输入了非整数,如何重新请求用户输入

C 如果用户输入了非整数,如何重新请求用户输入,c,validation,input,C,Validation,Input,我如何不断要求用户输入一个有效的整数输入?我知道如何验证整数范围输入,但当提示在C中输入整数时,我不知道如何验证非整数输入 #include <stdio.h> int main() { int menu; while(true) { printf("Choose a menu (1-4):\n"); do { scanf("%d", &menu); } while(menu <

我如何不断要求用户输入一个有效的整数输入?我知道如何验证整数范围输入,但当提示在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;
}
#包括
int main(){
int菜单;
while(true){
printf(“选择菜单(1-4):\n”);
做{
scanf(“%d”,菜单(&M);
}而(菜单<1 | |菜单>4);
如果(菜单==1){
printf(“菜单1\n”);
}否则如果(菜单==2){
printf(“菜单2\n”);
}否则如果(菜单==3){
printf(“菜单3\n”);
}else if(菜单==4){
printf(“菜单4,退出”);
打破
}
}
返回0;
}

如果有任何帮助,我将不胜感激。很抱歉,如果这是重复的,因为每次我尝试搜索解决方案时,它都在另一种语言上,或者线程询问“如何验证整数输入范围”,而不是非整数输入。

如果您想知道用户何时给出了非整数输入,方法如下:

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 */
字符编号;/*假设你只需要数字0-9*/
int菜单;
while(true)
{
scanf(“%c”和编号);

如果(数字>='0'&&number='0'&&s[itr]将输入与解析分开

考虑一个helper函数。使用
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;
    }
  }
}

您需要测试来自
scanf()
的返回值。如果它是EOF,将不会有更多的输入。如果它是零,则输入中等待的内容不能解释为数字。您需要读取下一个字符,可能直到下一个换行符(
int c;while((c=getchar())!=EOF&&c!='\n');
)。这是可行的,但如果我的输入范围是(1-999),您是否知道如何做到这一点?@baronoke我添加了一些额外的代码,您可以检查是否可以使用第二个算法输入一个整数范围,例如1-100?我尝试过,但由于数组大小和ASCII的方式,似乎不可能works@baronoke是的,我在一个在线gdb编译器上对一位数、两位数和三位数的数字尝试了这段代码,它运行得很好。你得到了答案吗ny错误?你能分享吗?我的意思是,有没有可能把这个算法转换成1-100个整数范围,而不是0-999
// 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) {
...