将条件运行为条件的真实陈述

时间:2019-02-27 17:03:06

标签: c cs50

我目前正在参加CS50课程,并且已经遇到了第一个障碍。基本上,我正在尝试检查不同的条件是否正确才能获得输出,但是即使我要介绍的内容正确,它似乎也不起作用。

    #include <stdio.h>
#include <cs50.h>

int main(void)
{
    int test = 0;
    double nr = get_double("Your card number please:\n ");
        while(test < 1)
        {
            if(nr / 100000000000000 < 10)
            {
                if(nr / 10000000000000 == 37)
                {
                    printf("AMEX");
                    test++;
                }
                else if(nr / 10000000000000 == 34)
                {
                    printf("AMEX");
                    test++;
                }
            }
            else {
            printf("false");
            }
        }
}

这是一个应该起作用的示例:378282246310005。即使输入错误的号码,也不会显示任何内容。 另外,我认为while循环不会中断,因为条件没有运行,或者我还缺少另一个错误?

先感谢一下

1 个答案:

答案 0 :(得分:2)

您正在使用double(浮点数的表示形式,不必为整数),这意味着当您将其除以除数时,结果不会被截断。对于您的示例(输入为378282246310005),nr / 10000000000000的值不是37,而是实际上是一个double,其值约为37.8282246 ...

输入将不适合int,因此cs50.h中可用的get_int函数将是不合适的。但是,值 将适合long,在CS50使用的环境中 1

使用类型nr声明long,并使用get_long()从用户处获取输入。然后,nr / 10000000000000的值将被截断为零,变为37,完全符合您的需要。

有关类型的说明:

1 libcs50文档get_long()的作者牢记long的64位带符号类型,并牢记了预期的工具链和环境。并非总是如此,特别是如果您的环境(操作系统,编译器等)与CS50的作者所期望的不匹配时。

如果您想在其他环境中使用long,则需要确保您的假设成立。概括地说long将来会是64位是不明智的,而没有先仔细核实这种情况。出于此分配的目的,给定的类型就足够了,但是您可能要考虑学习stdint.h标题,该标题提供了具有保证的指定大小的类型。