C语言循环中结构体字符数组意外拼接原因求助
问题根源与修复方案
核心问题:字符串终止符越界
你的结构体里prefix3、prefix4这类字符数组长度设为7,但你用strcpy写入的"MAT 236"或"COP 220",实际需要8个字节的存储空间:7个可见字符 + C语言字符串必须的空终止符'\0'。
当strcpy把字符串塞进长度为7的数组时,会超出数组边界,把'\0'写到相邻的内存区域——刚好就是下一个数组(比如prefix4)的起始位置。这时候用printf打印prefix3时,它会一直读取直到找到'\0',而这个终止符现在在prefix4里,所以看起来就像是prefix3拼接了prefix4的内容。
修复步骤
- 扩大字符数组长度:把结构体里所有
prefix数组的长度从7改成8,给终止符留出空间:typedef struct { char name[20]; int ID; int number_of_courses; int course_numbers[4]; char prefix1[8]; // 改为8 char prefix2[8]; char prefix3[8]; char prefix4[8]; int taken; } student_info; - 初始化数组避免垃圾值:结构体数组默认是未初始化的,里面存的是随机垃圾值,建议在使用前清空:
// 在main函数开头初始化整个students数组 student_info students[100] = {0};
验证效果
修改后,strcpy写入的字符串能完整容纳包括'\0'在内的所有字符,printf读取到终止符就会停止,不会跨数组读取,拼接问题就会消失。
内容的提问来源于stack exchange,提问作者Gringuitico
相关产品推荐
相关产品推荐

