You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 Pset1 Credit:计数后原变量值异常变更求助

CS50 Pset1 Credit:卡号变量值异常的原因及解决办法

核心问题分析

1. 输出格式符使用错误

你用%lo格式符输出number和num1,但%lo是用来输出**八进制(base-8)**的长整型数值,而卡号是十进制输入的,这导致输出结果是变量二进制值被解析为八进制后的错误展示——并不是变量值真的被修改了,只是输出格式完全错了。

正确的十进制长整型输出格式符应为%ld,若使用64位整数则用%lld。

2. long类型的溢出问题

多数系统中,long是32位有符号整数,最大值仅为2147483647(10位数字),而你输入的卡号378282246310005是15位数字,远超long的存储范围。当get_long尝试将这个超大数值存入long变量时,会触发整数溢出,导致变量存储的是截断/溢出后的错误值——这才是变量值异常的根源,和后续num1的操作完全无关,number在被赋值时就已经错了。

解决方法

  • 改用64位整数类型:将long替换为long long,其范围覆盖-9223372036854775808到9223372036854775807,足够存储19位以内的信用卡号。同时输入用get_long_long,输出格式符用%lld。
  • 用字符串存储卡号:直接将卡号作为字符串读取,彻底避免整数溢出问题,后续的位数统计、数字提取都可通过字符串操作完成,这也是处理超长数字的通用方案。

修正后的代码示例(long long版本)

// Asks the user for the card number
long long number;
long long num1;
do
{
    number = get_long_long("Number?\n");
}
while (number < 1 || number > 9999999999999999999LL);

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

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

内容的提问来源于stack exchange,提问作者Ben Archbold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:20:46