【问题标题】:Problem with a function that shuffles and squares an array in C++在 C++ 中对数组进行洗牌和平方的函数的问题
【发布时间】:2020-02-21 04:13:37
【问题描述】:

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

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;
}

【问题讨论】:

  • 为什么int 数组中的元素等于以空字符结尾的字符串字符?您可以使用 STL 算法完成所有这些操作,请参阅 std::transformstd::shuffle
  • 这个功能怎么样?请给minimal reproducible example 重现您的问题。
  • 如何在没有第二个参数的情况下获取数组的长度?我尝试使用 sizeof(arr) / sizeof(int) 但它给了我一个警告。
  • @Jamess11 获取函数的原始数组参数的长度是不可能的,因为传递的实际上只是一个指针。函数参数中的int field[]int* field 完全相同。这就是为什么你应该使用std::arraystd::vector 而不是原始数组。

标签: c++ arrays function sorting


【解决方案1】:

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

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

你一直读到一个空字符终止。显然,您永远不知道何时达到该目标,并且它不会是您阵列的尽头。因此,您通过指针的边界并进入undefined bahavior 土地。

另一方面,您无法找到数组的大小,因为当传递给函数时,数组会衰减为指针,而您无法通过 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)

【讨论】:

  • 我决定传递数组长度的第二个参数。非常感谢您的帮助!
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多