C语言图书检索程序ISBN查询输出乱码问题排查求助
问题根源:bsearch返回值类型错误转换
你的乱码问题核心出在vecRefSearchIsbn函数对bsearch返回值的处理上:
vec->refs是Book**类型的数组(存储的是指向Book结构体的指针),bsearch找到匹配项时,返回的是指向该数组元素的指针,也就是Book**类型,但你现在直接把它强制转换成了Book*,导致返回的不是真正的Book结构体地址,而是数组中存储的指针本身的地址。当printBook用这个错误地址访问结构体成员时,自然会读出乱码内存数据。
修复方案
修改vecRefSearchIsbn函数,正确处理bsearch的返回值:
Book *vecRefSearchIsbn(VecBookRef *vec, char *isbn){ int comparator(const void *key, const void *book){ const char *targetIsbn = (const char *)key; const Book *b = *(const Book **)book; return strcmp(targetIsbn, b->isbn); } // bsearch返回的是Book**类型,先转成对应指针类型 Book **result = (Book**)bsearch(isbn, vec->refs, vec->size, sizeof(Book *), comparator); if(result != NULL){ // 解引用得到真正的Book*指针 return *result; }else{ return NULL; } }
额外验证点
- 确保
isbnVec是按ISBN排序后的数组,bsearch要求目标数组必须已排序,否则查找结果不可预测。如果collecBuild中没有对isbnVec做排序,即使修复了指针问题,也可能找不到正确的图书。 - 确认
MAX_ISBN的定义至少为14(13位ISBN+1位字符串结束符),避免ISBN存储时出现截断。
内容的提问来源于stack exchange,提问作者Zé Antônio
相关产品推荐
相关产品推荐

