C - cs50/pset1/credit 无法弄清楚如何在不更改初始变量的情况下使用数字计数器



数字计数器工作,显示正确的位数,但是我的变量(number)从初始输入更改。我需要它保持不变,因为我稍后会在代码中使用它来测试它是什么类型的卡。下面是一个输入和输出示例。

/workspace/cs50/credit/$ ./credit号码吗?378282246310005dcounter 15num1 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, %in", dcounter);
printf("num1, %lon", num1);
printf("number, %lon", number);

我希望数字在数字计数器运行后保持378282246310005。我认为在dcounter中使用numc变量应该做到这一点,但可惜它没有。非常新的编码员,被困在这个几个小时。这是long类型的限制吗?

您正在使用printf%o格式化器(由l修改)。

输出八进制(以8为基数)格式的数字。

为什么要从十进制(以10为基数)改为八进制格式?
如果您使用%ld(长十进制整数格式),您是否得到正确的输出?

请参阅以下代码进行演示:

#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, %in", dcounter);
printf("num1, %lon", num1);
printf("number (octal), %lon", number);
printf("number (dec), %ldn", number);

return 0;
}
输出:

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

https://ideone.com/oTEw7B

您正在使用%lo规范以八进制方式打印输出-您真的打算这样做吗?数字的八进制表示将与您输入的十进制值不同。你应该使用%ld

从技术上讲,使用%liprintf()也是合法的,但不建议这样做。它在scanf()格式字符串中具有特殊的含义,并且为了与scanf()保持一致而包含在printf()中。然而,在printf()中,它仅表示"十进制",而在scanf()中,它表示"十六进制"、"八进制"或"十进制",具体取决于输入是以0x(或0X)开头,还是仅以0开头,或者以非零(十进制)数字开头。

考虑以下代码:

#include <stdio.h>
int main(void)
{
long number = 378282246310005L;
printf("Decimal: %ldn", number);
printf("Octal:   %lon", number);
return 0;
}

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

Decimal: 378282246310005
Octal:   12600566272504165

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

最新更新