cs50/pset 1/credit不知道如何在不改变初始变量的情况下使用数字计数器[已关闭]

mspsb9vt  于 2022-12-29  发布在  其他
关注(0)|答案(2)|浏览(147)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
18小时前关门了。
Improve this question
数位计数器工作,显示正确的位数,但是我的变量(number)从初始输入改变。我需要它保持不变,因为我稍后在代码中使用它来测试它是什么类型的卡。下面是一个输入和输出示例。
/工作空间/cs50/信用额度/$./信用额度编号?378282246310005数据计数器,15编号1,0编号,12600566272504165
我不明白为什么号码从378282246310005变了。
下面是有问题的代码部分...

//Asks the user for the card number
long number;
long num1;
    do
    {
        number = get_long("Number?\n");

    }
    while (number < 1 || number > 9999999999999999);

    num1 = number;
//Counts the digits the card has
int dcounter = 0;
    while (num1 != 0)
    {
        num1 /= 10;
        dcounter++;
    }

    printf("dcounter, %i\n", dcounter);
    printf("num1, %lo\n", num1);
    printf("number, %lo\n", number);

我希望在数字计数器运行后,number保持为378282246310005。我认为在dcounter中使用numc变量应该可以做到这一点,但遗憾的是它没有做到。非常新的编码器,并且在这方面停留了几个小时。会不会是长类型的限制?

wvyml7n5

wvyml7n51#

您正在使用printf%o化程序(由l修改为 long)。
它以八进制(base-8)格式打印数字。
为什么要将十进制(base-10)格式更改为八进制格式?
如果使用%ldlong decimal integer 格式),是否可以得到正确的输出?
请参见以下代码进行演示:

#include <stdio.h>

int main(void)
{
    long number = 378282246310005;
    long num1   = number;
    
    //Counts the digits the card has
    int dcounter = 0;
    while (num1 != 0)
    {
        num1 /= 10;
        dcounter++;
    }

    printf("dcounter, %i\n", dcounter);
    printf("num1, %lo\n", num1);
    printf("number (octal), %lo\n", number);
    printf("number (dec), %ld\n", number);
    
    return 0;
}

输出:

dcounter, 15
num1, 0
number (octal), 12600566272504165
number (dec), 378282246310005

https://ideone.com/oTEw7B

gajydyqb

gajydyqb2#

您正在使用%lo规范以八进制打印输出-您真的打算这样做吗?数字的八进制表示将与您输入的十进制值不同。您可能应该使用%ld
从技术上讲,将%liprintf()一起使用也是合法的,但并不推荐。它在scanf()字符串中有特殊的含义,为了与scanf()保持一致而包含在printf()中。然而,在printf()中,它只表示"十进制",而在scanf()中,它表示"十六进制或八进制或十进制,这取决于输入是以0x(或0X)开始,还是仅以0开始,还是以非零(十进制)数字开始。
请看下面的代码:

#include <stdio.h>

int main(void)
{
    long number = 378282246310005L;
    printf("Decimal: %ld\n", number);
    printf("Octal:   %lo\n", number);
    return 0;
}

假设您有一台64位计算机,并且正在编译一个64位可执行文件so sizeof(long) == 8(并且假设为CHAR_BIT == 8),则输出为:

Decimal: 378282246310005
Octal:   12600566272504165

请注意,通常最好将信用卡号(以及社会保险号、电话号码、驾照号等)视为字符串,而不是整数。

相关问题