You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:41:59