C 当检查变量是否为数字时,循环无限循环

C 当检查变量是否为数字时,循环无限循环,c,C,我对编程相当陌生,所以这个问题的答案可能很简单,但我找不到。当检查变量是否大于1000或小于1时,程序工作,但每当我输入一个字母时,程序就无限循环。无论如何,这是代码,谢谢你的帮助: printf("Player 1 enter A number between 1 and 1000: "); scanf("%d", &num); while(num<1 || num>1000 || !isdigit(num)){ printf("please enter dif

我对编程相当陌生,所以这个问题的答案可能很简单,但我找不到。当检查变量是否大于1000或小于1时,程序工作,但每当我输入一个字母时,程序就无限循环。无论如何,这是代码,谢谢你的帮助:

printf("Player 1 enter A number between 1 and 1000: ");
scanf("%d", &num);

while(num<1 || num>1000 || !isdigit(num)){
    printf("please enter  different number: ");
    scanf("%d", &num);
}
对于从用户处读取输入,scanf是一个糟糕的选择

你可能想要这个:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

// Get a number from the user
//    number:        pointer to the number
//    return value:  1 if the user has typed a number
//                   0 if the user ha not typed a number

int GetNumber(int *number)
{
  char inputbuffer[20];

  fgets(inputbuffer, sizeof inputbuffer, stdin);  // read raw line from user
  if (!isdigit(inputbuffer[0]))                   // if first char isn't a digit
    return 0;                                     // it's not a number, return 0

  *number = strtol(inputbuffer, NULL, 10);        // convert to number
  return 1;
}


int main()
{
  int num;

  printf("Player 1 enter A number between 1 and 1000: ");

  while (!GetNumber(&num) || num < 1 || num > 1000) {
    printf("please enter different number: ");
  }

  printf("number = %d\n", num);

  return 0;
}

scanf的返回值是多少?这些函数有返回值是有原因的,而您刚刚了解了一个原因。不做你想做的事。阅读文档。你认为isdigit3的回报是什么?好吧,这看起来比我的xD要复杂一点,但是谢谢你的帮助,我会努力了解这里面发生了什么,这将是一次学习的经历lol@N.DuToit这是函数使用的一个很好的例子,您的主程序要简单得多,因为GetNumber处理所有检查用户是否输入了数字或字母的操作。还将接受诸如124Hello之类的输入,并提取数字124,其余的则丢弃。可以通过稍微修改strtol来完善+1@DeiDei是的,这就是为什么我写的还有改进的余地
int GetNumber(int *number)
{
  char inputbuffer[20];

  fgets(inputbuffer, sizeof inputbuffer, stdin);

  char *endptr;
  *number = strtol(inputbuffer, &endptr, 10);
  if (*endptr != '\n')  // if user input ends with somethign else than
    return 0;           // \n it's not a number (e.g: "123a")

  return 1;
}