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

C语言输入处理代码customerName输出为(null)问题咨询

问题成因
  • 类型与格式符不匹配:代码中定义的customerName为单个char类型,仅支持存储1字节长度的单个字符,但输入、输出环节均使用了仅适配C风格字符串的%s格式符。%s要求对应参数为char*类型的字符串首地址,且字符串必须以\0作为结束标记:
    • 输入阶段:使用%s向单个char变量的地址写入内容,会触发栈缓冲区溢出,覆盖栈上其他变量数据,属于C语言未定义行为。
    • 输出阶段:printf("%s", customerName)会将customerName存储的字符值识别为内存地址,尝试从该地址读取字符串,该地址大概率为非法不可读地址,因此会输出(null),极端情况会直接导致程序崩溃。
  • 同类潜在错误:carCode同样是单个char类型,代码中也使用了%s进行输入,存在相同的缓冲区溢出问题,只是暂时未触发明显异常。
修复方案
  1. 将customerName的类型调整为字符数组,用于存储完整的用户名字符串,可根据实际需求定义数组长度,示例中定义为长度50的数组可支持最长49个字符的名字。
  2. 针对carCode单个字符的场景,将其输入格式符更换为适配单个字符的%c,同时在%c前添加空格,用于吃掉前序输入残留在缓冲区的换行符、空白符,避免读取到无效空内容。
  3. 输入customerName时无需添加取地址符&,数组名本身就是数组的首地址,符合%s的参数要求。
修复后完整代码
#include <stdio.h>

int main() {
    int carNumber;
    // 改为字符数组存储完整用户名
    char customerName[50];
    char carCode;

    printf("Enter Car Number: ");
    scanf("%d", &carNumber);
    printf("Enter Customer Name: ");
    // 数组名本身是首地址,不需要加&
    scanf("%s", customerName);
    printf("Enter Car Code: ");
    // %c前加空格吃掉缓冲区残留的空白字符
    scanf(" %c", &carCode);

    if (carCode == 'T'){
        printf("Toyota\n");
    }
    else if (carCode == 'H'){
        printf("Honda\n");
    }

    printf("Car Number: %d\n", carNumber);
    printf("Customer Name: %s\n", customerName);
    return 0;
}

内容的提问来源于stack exchange,提问作者max1eee -

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:06:01