c - 如何检查用户没有在C中输入十进制
问题描述
我必须编写一个程序来扫描从 1 到 5 的数字并显示与该数字相对应的报价。如果用户输入小数,或 >5 应该有错误。我的程序不能以正确的方式工作,如果用户输入例如 5.5 程序显示与 5 相对应的报价,但需要是一个错误。程序是用 C 语言的 Visual Studio Code 编写的。
有奇怪的报价,我知道:)
谢谢!
这是一个例子:
#include <stdio.h>
int main (int argc, char * argv []){
int x;
float y;
printf ("ml' nob:\n");
scanf("%f", &y);
x = (int)y;
if ((y - x) == 0 && x>=1 || x<=5){
if (x==1){
printf ("Qapla\'\n"
"noH QapmeH wo\' Qaw\'lu\'chugh yay chavbe\'lu\' \'ej wo\' choqmeH may\' DoHlu\'chugh lujbe\'lu\'.\n");
}
else if (x==2){
printf("Qapla\'\n"
"Qu\' buSHa\'chugh SuvwI\', batlhHa\' vangchugh, qoj matlhHa\'chugh, pagh ghaH SuvwI\'\'e\'.\n");
}
else if (x==3){
printf("Qapla\'\n"
"qaStaHvIS wa\' ram loS SaD Hugh SIjlaH qetbogh loD.\n");
}
else if (x==4){
printf("Qapla\'\n"
"Ha\'DIbaH DaSop \'e\' DaHechbe\'chugh yIHoHQo\'.\n");
}
else if (x==5){
printf("Qapla\'\n"
"leghlaHchu\'be\'chugh mIn lo\'laHbe\' taj jej.\n");
}
}
else {
printf ("luj");
}
}
解决方案
问题是条件(y - x) == 0 && x>=1 || x<=5
,它被评估为((y - x) == 0 && x>=1) || x<=5
。
既然x<=5
为真,那么整个条件为真。
原因是逻辑和运算符的运算符优先级&&
高于逻辑或运算符||
。
您需要在 range-check: 周围显式添加括号(y - x) == 0 && (x>=1 || x<=5)
。
实际上,该范围检查也是有缺陷的,因为它允许值大于5
(然后x>=1
将使其全部为真)或小于或等于零的值(因为x<=5
它将为真)。如果逻辑或运算符的任一侧||
为真,则整个条件为真。
你也需要在&&
这里使用:x>=1 && x<=5
.
如果你解决了这个问题,那么你就不需要额外的括号,并且(y - x) == 0 && x>=1 && x<=5
可以正常工作。