【发布时间】: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 是的,这只是我的疏忽。我想我已经阅读了很多次代码,以至于我什至没有看到。
-
为什么这个问题被否决了...?这是我自己广泛尝试解决后遇到的一个合理问题,我提供了大量证据证明我(当时)认为问题的可能根源是什么?