首页 > 解决方案 > 如何检查用户没有在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");
    }
}

标签: c

解决方案


问题是条件(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可以正常工作。


推荐阅读