C++数组字符串重复检测逻辑异常:无输出问题求助
问题分析与代码修复
核心错误原因
GetName的索引判断逻辑完全错误
原代码里的index < sizeof(osnove.arr[index])/sizeof(osnove.arr[0])完全搞错了数组长度的计算方式:- 数组的总长度应该是
整个数组的字节大小 / 单个元素的字节大小,也就是sizeof(osnove.arr)/sizeof(osnove.arr[0]) - 原代码用单个元素的大小去计算,导致只要index≥1就会判定为越界,返回
INDEX OUT OF RANGE\n,最终比较时两个字符串一个是真实姓名、一个是错误提示,自然永远不相等,所以没有输出。
- 数组的总长度应该是
循环边界的冗余处理
原循环里的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
相关产品推荐
相关产品推荐

