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

C++数组字符串重复检测逻辑异常:无输出问题求助

问题分析与代码修复

核心错误原因

  1. GetName的索引判断逻辑完全错误
    原代码里的index < sizeof(osnove.arr[index])/sizeof(osnove.arr[0])完全搞错了数组长度的计算方式:

    • 数组的总长度应该是整个数组的字节大小 / 单个元素的字节大小,也就是sizeof(osnove.arr)/sizeof(osnove.arr[0])
    • 原代码用单个元素的大小去计算,导致只要index≥1就会判定为越界,返回INDEX OUT OF RANGE\n,最终比较时两个字符串一个是真实姓名、一个是错误提示,自然永远不相等,所以没有输出。
  2. 循环边界的冗余处理
    原循环里的i < ...-1没必要,因为当i等于数组最后一个索引时,j=i+1会超出数组长度,内层循环自动不执行,直接写i < 数组长度更清晰。

修复后的完整代码

string Stringici::GetName(unsigned int index){
    // 计算数组实际长度,unsigned int类型的index不可能小于0,所以不需要判断index>=0
    const unsigned int arrLen = sizeof(osnove.arr)/sizeof(osnove.arr[0]);
    if(index < arrLen){
        return osnove.arr[index];
    }
    else{
        return "INDEX OUT OF RANGE\n";
    }
}

void Stringici::Comparer(){
    const unsigned int arrLen = sizeof(osnove.arr)/sizeof(osnove.arr[0]);
    for(unsigned int i=0; i < arrLen; i++){
        for(unsigned int j=i+1; j < arrLen; j++){
            // 提前获取姓名,避免重复调用GetName
            string name1 = GetName(i);
            string name2 = GetName(j);
            // 排除越界的错误字符串,防止误判
            if(name1 != "INDEX OUT OF RANGE\n" && name1 == name2){
                cout<<"姓名: "<<name1<<" 重复出现在位置 "<<i<<" 和 "<<j<<"\n";
            }
        }
    }   
}

额外提示

如果osnove.arr是动态分配的数组(比如用new创建),sizeof无法正确获取数组长度,这时候需要在类里额外维护一个记录数组长度的成员变量。

内容的提问来源于stack exchange,提问作者The Coding Kenan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:16:33