strcpy()行为异常:书名被追加至ISBN字段的问题排查
问题原因及解决方案
核心问题:字符串缺少终止符'\0'
你的book.isbn定义为char isbn[13],刚好只能存13个字符,但C语言里字符串必须以'\0'(空字符)作为结束标记。当你把13位的ISBN内容复制到这个数组里时,数组被完全填满,没有多余空间存放'\0'。
此时,所有依赖字符串终止符的函数(比如printf)会继续读取后续内存空间的内容,直到找到'\0'为止。如果你的book结构体中,isbn字段之后紧接着就是title字段,那么title的内容就会被当成isbn字符串的一部分被输出,看起来像是书名被追加到了ISBN里——这不是系统分配了额外内存,而是内存越界访问导致的非法读取。
为什么其他字段正常?
其他字段没有出现这个问题,大概率是因为它们的内容长度没占满对应的数组空间,或者你在复制时无意中保留了'\0'(比如用strcpy时,原字符串本身带终止符,且目标数组有足够空间容纳)。
解决办法
- 调整数组长度:把
isbn的定义改成char isbn[14],这样就能容纳13位ISBN数字加上末尾的'\0',这是最稳妥的方案。 - 手动添加终止符(仅适用于允许截断ISBN的场景):如果必须保留
char isbn[13],复制时最多只存12位字符,然后手动补上'\0':// 假设isbn_token是strtok得到的ISBN字符串 strncpy(book.isbn, isbn_token, 12); book.isbn[12] = '\0';
内容的提问来源于stack exchange,提问作者Saif eldeen Adel
相关产品推荐
相关产品推荐

