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

