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

C语言调用scanf后char变量值被置零的原因咨询

问题原因及解决方案

你的问题本质是内存越界引发的未定义行为,具体原因如下:

  1. 类型不匹配导致内存写入溢出

    • char类型在绝大多数系统中仅占1字节,而int类型通常占4字节。
    • scanf的%d格式符是专门用于读取int类型数据的,它会尝试向传入的地址写入完整的4字节数据。
    • 你定义的三个char变量在栈上是连续分配的,当用%d给其中一个char变量赋值时,会一次性写入4字节,直接覆盖该变量相邻的内存区域——这就会修改其他char变量的值。
  2. 为什么被覆盖的变量会变成0?
    你输入的数值(15、24、40)都是小整数,它们的二进制表示中只有低字节(1字节)有非零值,剩下的3个高位字节都是0。当scanf写入4字节时,覆盖到其他char变量的正好是这些高位的0字节,所以之前赋值的变量会被改成0。


修复方案

有两种简单的修复方式:

方式1:使用正确的格式符读取char类型

对于signed char,使用%hhd格式符(C99及以上标准支持);如果是unsigned char,则用%hhu。修改后的代码如下:

#include <stdio.h>

int main(){
    char mychar;
    char mychar2;
    char mychar3;

    scanf(" %hhd",&mychar);
    printf("char1 is :%d \n",mychar);

    scanf(" %hhd",&mychar2);
    printf("char1 is :%d\n",mychar);
    printf("char2 is :%d\n",mychar2);

    scanf(" %hhd",&mychar3);
    printf("char1 is :%d\n",mychar);
    printf("char2 is :%d\n",mychar2);
    printf("char3 is :%d",mychar3);

    return 0;
}

方式2:将变量类型改为int

如果不需要严格使用char类型,直接把变量定义为int,这样%d格式符就能正确匹配,不会出现内存越界:

#include <stdio.h>

int main(){
    int mychar;
    int mychar2;
    int mychar3;

    scanf(" %d",&mychar);
    printf("char1 is :%d \n",mychar);

    scanf(" %d",&mychar2);
    printf("char1 is :%d\n",mychar);
    printf("char2 is :%d\n",mychar2);

    scanf(" %d",&mychar3);
    printf("char1 is :%d\n",mychar);
    printf("char2 is :%d\n",mychar2);
    printf("char3 is :%d",mychar3);

    return 0;
}

内容的提问来源于stack exchange,提问作者amr mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:47:39