我看到了几个类似的问题,但他们对我的具体案例没有答案。我只需要在结构数组中交换两个元素的位置,但到目前为止我尝试的所有内容都只会复制其中一个。我认为问题在于交换功能。
我需要在不使用标准库函数的情况下执行此操作。这就是我所拥有的:
struct RentalCar {
int year;
char make[STRLEN];
char model[STRLEN];
float price;
bool available;
};
void carCopy(RentalCar *dest, RentalCar *source) { // dest = source
dest->year = source->year;
myStrCpy(dest->make, source->make); // copy c-strings
myStrCpy(dest->model, source->model);
dest->price = source->price;
dest->available = source->available;
}
void carSwap(RentalCar *car1, RentalCar *car2) {
RentalCar *carTemp = car1;
carCopy(carTemp, car2); // tried different orders, only copy no swap
carCopy(car2, car1);
}
char *myStrCpy(char *dest, const char *source) { // copy cstring
char *origin = dest; // non iterated address
while (*source || *dest) {
*dest = *source;
dest++;
source++;
}
return origin; // could return void instead
}
答案 0 :(得分:1)
在carSwap
中,carTemp
是指向与car1
相同的内存位置的指针。这条线
carCopy(carTemp, car2); // tried different orders, only copy no swap
使用car1
覆盖car2
。
将carSwap
更改为:
void carSwap(RentalCar *car1, RentalCar *car2) {
RentalCar carTemp;
carCopy(&carTemp, car2);
carCopy(car2, car1);
carCopy(car1, &carTemp);
}
答案 1 :(得分:1)
我只需要交换数组中两个元素的位置 结构[...]
最简单地回答这个问题,在您的情况下,似乎可以使用浅拷贝来完成,因为您的结构中的所有内容都是浅层可复制的。例如。如果你想在数组中交换位置i和j:
RentalCar tmp = array[i];
array[i] = array[j];
array[j] = tmp;
我错过了什么吗?我读了你的代码,但在回答你的问题时似乎并不重要。告诉我,如果我错过了什么。
注意,如果你有一个指针数组(对于RentalCar),那么这可以做得更好:没有RentalCar的tmp结构。