首页 > 解决方案 > 检查变量是否为数字时,while循环无限循环

问题描述

我对编程很陌生,所以对这个问题的回答可能很简单,但我找不到。当检查变量是超过 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);
}

标签: c

解决方案


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;
}

替代版本GetNumber

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;
}

推荐阅读