我试图让用户输入一个整数,以供以后在程序中使用,我希望它强制用户输入一个输入,直到它是一个整数为止。当我运行这段代码时,它会像这样无限循环:
输入最小运算符:输入最小运算符:输入最小运算符:输入最小运算符:输入最小运算符:输入最小运算符:..........
我认为问题出在扫描仪上,但是我不确定应该如何使用它。
#include <stdio.h>
#include <ctype.h>
int main(int argc, const char * argv[]) {
char operator;
int largestOpperator, smallestOpperator;
printf("Enter The Table Operator (+, -, *, /, %%, or R): ");
scanf("%c",&operator);
/*while(!(operator == '+' || operator == '-' || operator == '*' || operator == '/' ||operator == '%' || operator == 'R'))
{
printf("Enter Appropriate Table Operator (+, -, *, /, %%, or R): ");
scanf(" %c",&operator); //requires space as a way to skip the enter when char is scanning!!
}*/
do{
if(!isdigit(smallestOpperator))
printf("Enter smallest operator: ");
else{
printf("Enter an actual number: ");
scanf(" %d", &smallestOpperator);
}
}while(!isdigit(smallestOpperator));
printf("Enter largest operator: ");
scanf("%d", &largestOpperator);
{
printf("Enter a valid integer: ");
scanf("%d", &largestOpperator);
}
return 0;
}
答案 0 :(得分:0)
显然isdigit(smallestOperator)
返回false
,因为这是while
的条件,并且您看到了无限循环。
检查smallestOperator
的值的明智方法是在 debugger 中运行代码-这将向您显示变量的类型,其值,其在内存中代表性-您可能需要的一切。
实现同一目标的更肮脏的方法是在代码中添加 debugging printfs ,以便在检查之前打印该值。
但是,我们可以看到您正在使用scanf(" %d", ...)
来读取smallestOperator
。 scanf
的联机帮助页显示:
d-匹配一个可选的带符号十进制整数;下一个指针必须是指向int的指针。
因此,您从scanf
得到一个整数,然后进行测试以查看它是否是一个数字的字符。
您有两种方法可以解决此问题:
从scanf中获取一个 char :scanf(" %c", &smallestOperatorAsChar)
-然后用isDigit()
对其进行测试,然后将其转换为整数:Convert a character digit to the corresponding integer in C
无论如何,您应该始终检查IO调用的返回值。 scanf()
返回成功转换的项目数。如果它少于您期望的数量,则可以使用它来触发错误处理。
int rc = scanf("%d", &i);
char junkChar;
while(rc < 1) {
printf("Invalid");
scanf("%c", &junkChar);
rc = scanf("%d", &i);
}
请参阅:why does scanf not wait for user input after it fails one time? -在已接受的答案中,观察到scanf()
不是一种很好的stdin输入机制,因此您不应该太努力地尝试解决它:要么控制住,要么通过围绕fgets()
编写自己的例程或引入一个更聪明的库。