【问题标题】:Why does a while loop run infinitely instead of waiting for more input from fgets()?为什么 while 循环会无限运行而不是等待 fgets() 的更多输入?
【发布时间】:2017-02-07 06:39:10
【问题描述】:

男孩,这该死的东西难倒我。我想创建一个循环来验证用户是否输入了 int (而不是其他数据类型)。为此,我使用fgets() 获取用户输入的第一个字符,然后检查该字符是否为数字(这是我的代码破解任务的最小部分)。

char input[2];

int main(){
  printf("Please enter the minimum value the random number can be: ");
  fgets(input, sizeof(input), stdin);
  printf("%c", input[0]);
  if(!isdigit(input[0])){
    int escape = 0;
    while(escape == 0)
      printf("Try again: ");
      fgets(input, sizeof(input), stdin); //This will now overwrite whatever was in 'input'
      if (isdigit(input[0])) //Will keep looping back to the fgets(), asking for new input each time until you enter a number.
        escape = 1;
      flushInpt();
  }

在上面的代码中(假设所有正确的库都是#included),它应该要求输入(它确实)然后检查该输入的第一个字符是否是数字(它确实),如果它不是数字,它应该进入一个while循环,在该循环中打印“再试一次:”,并带有一个新的fgets(),等待用户输入新的输入。它停留在while 循环中,直到他们输入一个数字作为第一个字符,此时它会跳出循环(这是它不做的部分)。

但是每当我第一次输入一个非数字时,它会按预期进入while 循环,然后一遍又一遍地无限打印“再试一次:”,而不会在getsf() 语句处停下来等待新输入?我的问题是为什么会无限循环?


我也验证了 flushInpt() 函数不是罪魁祸首,因为无论该调用是否在循环中都会出现问题。如果您想知道,flushInpt 只是一个基本的循环函数,它遍历输入缓冲区并删除可能存在的任何内容。

char ch;

void flushInpt(){
  while ((ch = getchar()) != '\n' && ch != EOF)
  continue;
}

【问题讨论】:

  • 不是您观察到的原因,但仍然很重要:getchar() 返回int 而不是char
  • C 与 Python 不同——你必须用大括号显式地对语句进行分组。
  • @JonathanLeffler 是的,这只是我的疏忽。我想我已经阅读了很多次代码,以至于我什至没有看到。
  • 为什么这个问题被否决了...?这是我自己广泛尝试解决后遇到的一个合理问题,我提供了大量证据证明我(当时)认为问题的可能根源是什么?

标签: c fgets


【解决方案1】:

你缺少花括号:

while(escape == 0)
{   //<--
  printf("Try again: ");
  fgets(input, sizeof(input), stdin); //This will now overwrite whatever was in 'input'
  if (isdigit(input[0])) //Will keep looping back to the fgets(), asking for new input each time until you enter a number.
    escape = 1;
  flushInpt();
}   //<--

我猜这个块是你的 while 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2016-07-22
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    相关资源
    最近更新 更多