交换指针数组中的元素
Swapping elements in Array of Pointers
我在 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;
}
}
提前致谢!我花了几个小时试图解决这个问题,每次我这样做都会以混乱的顺序结束,或者没有交换第一个和最后一个预期的任何元素。
你的代码有两个问题-
- 在函数
ArrSwap()
中,您在索引 0 到 5 之间循环。因此,当 i
变为 5
时,Arr[i+1]
指向 Arr[6]
,这导致从超出数组边界的内存中读取。这是未定义的行为。
- 其次,如果我的要求正确,你想交换交换的第一个和第二个元素,然后是第三个和第四个,依此类推。所以,你的代码有逻辑错误。在这种情况下,在
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点说的)。正如 ikegami 提到的,最佳做法是将数组大小作为参数传递(比如 n
)并在循环条件中使用 n - 1
。
- 逻辑固定(如上第2点所述)
- 交换时,使用
char *
代替void *
(Arr
中的元素类型为char *
)
ArrSwap()
的 return 类型被称为 void
。 void
清楚地表明 ArrSwap()
不会 return 任何东西。
修复后 inputs
将是:
{"Fly high dragonfly", "Kangaroo my shoe", "Jumping Ape", "Philosophical Monkey", "Tall Giraffes", "Fearful lemurs"}
我在 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;
}
}
提前致谢!我花了几个小时试图解决这个问题,每次我这样做都会以混乱的顺序结束,或者没有交换第一个和最后一个预期的任何元素。
你的代码有两个问题-
- 在函数
ArrSwap()
中,您在索引 0 到 5 之间循环。因此,当i
变为5
时,Arr[i+1]
指向Arr[6]
,这导致从超出数组边界的内存中读取。这是未定义的行为。 - 其次,如果我的要求正确,你想交换交换的第一个和第二个元素,然后是第三个和第四个,依此类推。所以,你的代码有逻辑错误。在这种情况下,在
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点说的)。正如 ikegami 提到的,最佳做法是将数组大小作为参数传递(比如n
)并在循环条件中使用n - 1
。 - 逻辑固定(如上第2点所述)
- 交换时,使用
char *
代替void *
(Arr
中的元素类型为char *
) ArrSwap()
的 return 类型被称为void
。void
清楚地表明ArrSwap()
不会 return 任何东西。
修复后 inputs
将是:
{"Fly high dragonfly", "Kangaroo my shoe", "Jumping Ape", "Philosophical Monkey", "Tall Giraffes", "Fearful lemurs"}