交换指针数组中的元素

我在 C 中有以下数组(使用随机名称)

char * inputs[6] = {
  "Kangaroo my shoe", "Fly high dragonfly",
  "Philosophical Monkey", "Jumping Ape",
  "Fearful lemurs", "Tall Giraffes"
};

目标是用下一个交换第一个元素。就像在做这个

char * inputs[6] = {
  "Fly high dragonfly", "Kangaroo my shoe",
  "Jumping Ape", "Philosophical Monkey",
  "Tall Giraffes", "Fearful lemurs"
};

我已经尝试了以下以及更多。

ArrSwap(char *Arr[]){
  int i;
  for(i=0;i<6;i++){
    void*temp = Arr[i];
    Arr[i]=Arr[i+1];
    Arr[i+1] = temp;
  }
} 

提前致谢!我花了几个小时试图弄清楚这一点,每次我这样做都会以混乱的顺序结束,或者没有交换第一个和最后一个预期的任何元素。

回答

您的代码中有两个问题-

  1. 在函数中,ArrSwap()您在索引 0 到 5 上循环。因此,何时i变为5,Arr[i+1]指向Arr[6]哪个导致从超出数组边界的内存中读取。这是未定义的行为。
  2. 其次,如果我正确地得到您的要求,您想交换交换的第一个和第二个元素,然后是第三个和第四个,依此类推。所以,你的代码有一个逻辑错误。在这种情况下,在ArrSwap()循环中需要增加 2 而不是 1。

因此,在解决这两个问题后,代码可能如下所示 -

void ArrSwap(char *Arr[]){
    int i;
    for(i=0; i<5; i+=2) {
        char *temp = Arr[i];
        Arr[i]=Arr[i+1];
        Arr[i+1] = temp;
    }
}

请注意,ArrSwap()函数中进行了以下更改-

  • 循环测试条件从i < 6变为i < 5(上面第 1 点提到的原因)。正如池上所说,最佳实践是将数组大小作为参数传递(例如n)并n - 1在循环条件中使用。
  • 逻辑是固定的(如上面第 2 点所述)
  • 对于交换,使用char *而不是void *(元素的类型Arrchar *
  • 的返回类型ArrSwap()被提及为void。随着void它清楚地传达,ArrSwap()不会返回任何东西。

修复inputs后将是:

{"Fly high dragonfly", "Kangaroo my shoe", "Jumping Ape", "Philosophical Monkey", "Tall Giraffes", "Fearful lemurs"}


以上是交换指针数组中的元素的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>