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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 19:45:07