C语言实现12位数字存储为整型时输出异常的问题咨询
代码核心错误与异常输出成因
- 变量类型与格式符完全错配:你定义的
number是长度12的字符数组(char number[12]),单字节元素总共仅占12字节栈空间,却使用长整型对应的%lli格式符做读写。%lli要求传入的是指向8字节长整型存储空间的指针,scanf会严格按照64位整数的规则向传入的地址写数据,直接对字符数组的内存块做越界写入,完全不符合“存储12位整数”的预期。 - 循环判断逻辑完全失效:
while (number == 1)的判断对象是数组名,数组名本质是指向首元素的地址常量,不是存储的输入数值。拿地址值和整数1做比较,既无法识别输入内容是否合法,也无法实现“输入不对就重新提示”的预期效果。 - 异常输出的来源:因为类型完全不匹配,输入123后,写操作、读操作都没有按照正确的内存规则对应到输入值本身。你最终用
%lli读取字符数组所在的内存块时,读出来的是栈上相邻区域的随机残留值,也就是你看到的27583791809822484这类无意义的乱数,和你实际输入的123没有关联。 - 函数签名不符合C语言标准:
void main(void)是非标准的老旧写法,标准C规定main函数的返回值类型为int,用于向操作系统返回程序运行的退出状态码,void写法的可移植性很差。
代码格式与规范问题
- 类型定义和使用脱节:要存储long long整数,无需定义字符数组,应当直接定义对应类型的变量;scanf操作时必须传入变量的内存地址(也就是加取地址符
&),因为scanf需要通过指针修改变量的存储空间。 - 缩进层级不统一:循环块内的代码没有做统一的缩进,可读性差。
- 业务校验逻辑缺失:do-while循环没有补充实际的输入合法性判断,既没有校验输入长度是否为12位,也没有过滤非数字输入,循环条件没有实际作用。
修正后的最小可运行代码参考:
#include <stdio.h> int main(void) { long long int card_number; do { printf("Credit Card Number: "); scanf("%lld", &card_number); } while (card_number < 100000000000LL || card_number > 999999999999LL); printf("Your input card number is: %lld\n", card_number); return 0; }
注:12位整数的最大取值为999999999999,远小于long long int的存储上限,完全可以正常承载,不存在存储空间不足的问题。
内容的提问来源于stack exchange,提问作者SomeGuy
相关产品推荐
相关产品推荐

