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
相关产品推荐
相关产品推荐

