C++实现用户输入数组时遍历检测重复值并拒绝录入的方法
原代码问题说明
原实现无法达到预期的核心问题如下:
- 重复检测遍历范围错误:内层循环从
j=i+1开始遍历,但i之后的数组元素还未赋值,存储的是内存随机垃圾值,根本无法做有效比对。正确的检测范围应该是已经完成赋值的0到i-1索引位。 - 缺少重复输入的循环校验:原逻辑仅做一次重复判断,如果用户重新输入的值仍然和已有元素重复,程序不会再次检测,直接进入下一个索引的输入流程。
- 提示文本不符合要求:原代码输出的重复提示携带了索引信息,和示例要求的
Invalid. Enter a new number:不一致。 - 语法兼容性问题:原代码使用的变长数组(
int array1[size],size为运行时输入的变量)不属于标准C++语法,仅部分编译器做了扩展支持,兼容性差。
修正后可运行代码
#include <iostream> using namespace std; int main() { int size; cout << "Enter list size: "; cin >> size; int* array1 = new int[size]; for (int i = 0; i < size; i++) { cout << "Enter value for index " << i << ": "; cin >> array1[i]; bool needReinput = true; while (needReinput) { needReinput = false; // 遍历所有已输入的元素做重复校验,符合题目要求的遍历搜索规则 for (int j = 0; j < i; j++) { if (array1[i] == array1[j]) { cout << "Invalid. Enter a new number: "; cin >> array1[i]; needReinput = true; break; } } } } delete[] array1; return 0; }
实现逻辑说明
- 每次输入当前索引位的数值后,仅遍历之前已经完成赋值的元素做比对,不会访问未初始化的内存位置,避免误判。
- 用while循环包裹校验逻辑,只要检测到重复就提示重输,且每次输入新值后都会重新遍历所有已有元素做检测,确保重输的值也不会重复。
- 所有输入输出提示完全匹配给出的运行示例。
- 采用动态内存申请的方式创建数组,符合标准C++语法,跨编译器兼容性更好。
内容的提问来源于stack exchange,提问作者adover
相关产品推荐
相关产品推荐

