C++ 如何修复由循环中的错误产生的错误结果?

C++ 如何修复由循环中的错误产生的错误结果?,c++,arrays,C++,Arrays,我的程序必须填充数组唯一值。它的意思是,rand()分配一个随机值数组,然后循环必须控制它 我试着在步骤结束时使用调试,它告诉我一切正常,程序必须正常工作 int main() { srand(time(NULL)); int value; const int size = 10; int array[size]; for (int i = 0; i < size;) { bool alreadyThere = false;

我的程序必须填充数组唯一值。它的意思是,rand()分配一个随机值数组,然后循环必须控制它


我试着在步骤结束时使用调试,它告诉我一切正常,程序必须正常工作

int main()
{
    srand(time(NULL));
    int value;
    const int size = 10;
    int array[size];

    for (int i = 0; i < size;) {
        bool alreadyThere = false;
        value = rand() % 20;

        for (int j = 0; j < i; j++) {
            if (value == array[j]) {
                alreadyThere = true;
                break;
            }
        }

        if (!alreadyThere) {
            array[i] = value;
            i++;
            cout << array[i] << " " << endl;
        }
    }

    return 0;
}
intmain()
{
srand(时间(空));
int值;
常数int size=10;
int数组[大小];
对于(int i=0;icout您应该在循环结束时递增
i
。否则当
i++
的结果为10时,数组[i]
具有未定义的行为,因为允许的最大索引为9

正确代码:

array[i] = value;
cout << array[i] << " " << endl;
i++;
数组[i]=值;
在这一部分中:

            array[i] = value;
            i++;
            cout << array[i] << " " << endl;
还有这个部分

        value = rand() % 20;
将发射0到19之间的值,而不是1到20之间的值

应该是

    value = rand() % 20 + 1;

获取1到20之间的值。

您的代码中有些地方出错,可能是通过调试器找到的

  • array
    从未初始化过(因此充满了垃圾)。因此比较它
    value==array[j]
    是错误的
  • i++;
    位置错误,应该在std::cout之后
例如:

int main()
{
    std::srand(time(NULL));
    int value;
    const int size = 10;
    int myArray[size] = {0};

    for (int i = 0; i < size;) {
        bool alreadyThere = false;
        value = std::rand() % 20;

        for (int j = 0; j < i; j++) {
            if (value == myArray[j]) {
                alreadyThere = true;
                break;
            }
        }

        if (!alreadyThere) {
            myArray[i] = value;            
            std::cout << myArray[i] << " " << std::endl;
            i++;
        }
    }

    return 0;
}
intmain()
{
标准::srand(时间(空));
int值;
常数int size=10;
int myArray[size]={0};
对于(int i=0;istd::cout“我试着在步骤结束时使用调试,它向我表明一切正常,程序必须正常工作。”你是什么意思?要么正常,要么不正常。调试说一切正常,但不是。“调试控制台出错。我在控制台中达到了-858993460 10次。”(我忘了添加,值必须在1到20之间)我看到了-1票。不应该对新手太苛刻。OP在代码中犯的错误是每个人都会犯的。@MAX777-1并不苛刻。这意味着有一个人发现这个问题值得投否决票。@Leeker你有没有试过将种子点设为0。问题不仅会发生在
I=10
@MikeCAT我因为未定义的行为会改变整个程序。例如,当我运行它时,它会打印20个值,而不是10个值。在您修复代码,使
array[10]
不执行后,整个程序正常工作。您的建议是正确的。谢谢!
int main()
{
    std::srand(time(NULL));
    int value;
    const int size = 10;
    int myArray[size] = {0};

    for (int i = 0; i < size;) {
        bool alreadyThere = false;
        value = std::rand() % 20;

        for (int j = 0; j < i; j++) {
            if (value == myArray[j]) {
                alreadyThere = true;
                break;
            }
        }

        if (!alreadyThere) {
            myArray[i] = value;            
            std::cout << myArray[i] << " " << std::endl;
            i++;
        }
    }

    return 0;
}