首页 > 解决方案 > 在 C++ 中对数组进行洗牌和平方的函数的问题

问题描述

我正在尝试编写一个函数,该函数将随机化数组中元素的顺序并对这些元素进行平方。我设法用两个参数编写它,但是我想只使用一个参数来编写它,但由于某种原因,我总是得到奇怪的值作为解决方案。有时它们是正确的,有时它们不是。这是我的功能的代码:

int *randomizedField(int field[]){
    int temp = 0;
    int random = 0;
    int i = 0;
    int j = 0;
    while(field[i] != '\0'){
        field[i] = field[i] * field[i];
        i++;
    }
    while(field[j] != '\0'){
        random = rand() % i;
        temp = field[j];
        field[j] = field[random];
        field[random] = temp;
        j++;
    }
    return field;
}

标签: c++arraysfunctionsorting

解决方案


您的循环中有未定义的行为:

while(field[i] != '\0')

你一直读到一个空字符终止。显然,您永远不知道何时达到该目标,并且它不会是您阵列的尽头。因此,您越过指针的边界并进入未定义的行为领域。

另一方面,您无法找到数组的大小,因为当传递给函数时,数组会衰减为指针,而您无法找到它的大小sizeof(field)/sizeof(int)

要解决您的问题,请将数组的长度传递给函数,或者最好使用 STL 容器之一,例如std::vectorstd::array

第一个循环将是:

for(int i = 0; i < field.size(); ++i) { 
   field[i] = field[i] * field[i]; 
   i++;
}

函数签名可以是:

void randomizedField(std::vector<int>& field)

推荐阅读