C语言char数组定义为2却输出多字符,grade与mark列内容混叠求助
问题定位与解决方案
核心原因
你在struct data里定义的grade是长度为2的char数组,但像"B+"这类双字符等级标识,加上C语言字符串必须的**终止符'\0'**一共需要3个字节的存储空间。数组长度不足会导致字符串无法正确终止,输出时会越界读取后续mark成员的内存内容,从而出现两列内容混叠的情况。而单字符等级(如"A")刚好能在第二个数组位置存放'\0',所以这类行不会出现异常,这就是问题只在部分行出现的原因。
修复方案
- 调整
grade的数组大小为3,预留出终止符的位置:
struct data { // 其他成员保持不变 char grade[3]; // 从[2]改为[3] float mark; };
- 确保赋值时使用标准字符串操作函数(比如
strcpy),这类函数会自动在字符串末尾添加'\0'。如果是手动赋值单个字符,记得手动设置终止符:
// 示例:手动赋值单字符等级时 data[i].grade[0] = 'A'; data[i].grade[1] = '\0'; // 手动添加终止符
验证提示
修改后可以检查所有行的输出,双字符等级(如"B+"、"C-")的输出会正常终止,不会再和mark内容混叠。
内容的提问来源于stack exchange,提问作者Dodek Mardana
相关产品推荐
相关产品推荐

