c - 强制用户使用 C 中的 While 循环输入整数
问题描述
我试图让用户输入一个整数,以便稍后在程序中使用我希望它强制用户输入一个输入,直到它是一个整数。当我运行此代码时,它会像这样进入无限循环:
输入最小运算符: 输入最小运算符: 输入最小运算符: 输入最小运算符: 输入最小运算符: 输入最小运算符:......
我认为问题出在扫描仪上,但我不确定应该如何处理它。
#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;
}
解决方案
显然isdigit(smallestOperator)
正在返回false
,因为这是 的条件while
,并且您看到的是无限循环。
检查值的明智方法是在调试器smallestOperator
中运行代码——这将向你显示变量的类型、它的值、它在内存中的表示——你可能需要的一切。
实现相同目的的更肮脏的方法是将调试 printfs添加到您的代码中,以在检查值之前打印该值。
但是,我们可以看到您正在使用scanf(" %d", ...)
to 阅读smallestOperator
. 手册页scanf
说:
d - 匹配可选带符号的十进制整数;下一个指针必须是指向 int 的指针。
所以你得到一个整数,scanf
然后测试它是否是一个数字的字符。
您有两种选择来解决此问题:
读取一个字符,测试它,转换它
从 scanf 中获取一个字符scanf(" %c", &smallestOperatorAsChar)
: -- 然后用 测试它isDigit()
,然后将其转换为整数:将字符数字转换为 C 中的相应整数
(更好)让 scanf() 告诉你转换错误
无论如何,您应该始终检查 IO 调用的返回值。scanf()
返回它成功转换的项目数。如果它小于您预期的数字,您可以使用它来触发您的错误处理。
int rc = scanf("%d", &i);
char junkChar;
while(rc < 1) {
printf("Invalid");
scanf("%c", &junkChar);
rc = scanf("%d", &i);
}
请参阅:为什么 scanf 一次失败后不等待用户输入?- 接受的答案观察到这scanf()
不是一个很好的标准输入机制,所以你不应该太努力地试图解决它:要么通过编写自己的例程来控制,fgets()
要么引入一个更聪明的库。
推荐阅读
- c - 为什么在给定的“C”代码片段中 x 的值为 28?
- powershell - 显示Outlook约会的持续时间?
- sql-server - 导入到 SQL Server 时忽略 Excel 文件中的列
- angular6 - 单击按钮弹出后未显示在 angulr6 项目中
- r - 在R中连接地图上的两个点
- reactjs - 更改 Redux 状态不会影响渲染视图
- foreach - Gulp:paths.scss.forEach 不是函数
- json - 在 Nifi 中多次拆分后合并 Json
- javascript - 无法使用 javascript 更改标题字体大小
- react-router - 警告:[react-router] 位置“/add”不匹配任何路由