- 已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是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变量应该可以做到这一点,但遗憾的是它没有做到。非常新的编码器,并且在这方面停留了几个小时。会不会是长类型的限制?
2条答案
按热度按时间wvyml7n51#
您正在使用
printf
和%o
化程序(由l
修改为 long)。它以八进制(base-8)格式打印数字。
为什么要将十进制(base-10)格式更改为八进制格式?
如果使用
%ld
(long decimal integer 格式),是否可以得到正确的输出?请参见以下代码进行演示:
输出:
https://ideone.com/oTEw7B
gajydyqb2#
您正在使用
%lo
规范以八进制打印输出-您真的打算这样做吗?数字的八进制表示将与您输入的十进制值不同。您可能应该使用%ld
。从技术上讲,将
%li
与printf()
一起使用也是合法的,但并不推荐。它在scanf()
字符串中有特殊的含义,为了与scanf()
保持一致而包含在printf()
中。然而,在printf()
中,它只表示"十进制",而在scanf()
中,它表示"十六进制或八进制或十进制,这取决于输入是以0x
(或0X
)开始,还是仅以0
开始,还是以非零(十进制)数字开始。请看下面的代码:
假设您有一台64位计算机,并且正在编译一个64位可执行文件so
sizeof(long) == 8
(并且假设为CHAR_BIT == 8
),则输出为:请注意,通常最好将信用卡号(以及社会保险号、电话号码、驾照号等)视为字符串,而不是整数。