修复你的代码
首先,您的代码存在一些非常严重的基本问题。不过,在我们解决这些问题之前,让我们先解决您目前所拥有的问题。您的排序循环似乎对 a 数组进行了一半排序,对 b 数组进行了一半排序。您也从未初始化 b 数组以包含任何值。这是您的代码的更正版本:
#define CLASS_SIZE 10
#include <stdio.h>
void bubbleSortAWriteToB(const char a[], char * b[]);
int main(void){
int i;
// initialize array
char * s_letters[CLASS_SIZE];
char letters[CLASS_SIZE] = {'a','r','p','b','r','c','x','e','w','j'};
// sort array
bubbleSortAWriteToB(letters,s_letters);
// print sorted array
for (i=0;i<CLASS_SIZE;i++){
printf("%c\n", *s_letters[i]);
}
return 0;
}
void bubbleSortAWriteToB(const char a[], char * b[]){
char * temp;
int i,j;
// initialize b array to hold pointers to each element in a
for (i=0;i<CLASS_SIZE;i++){
b[i] = (char *)(a) + i;
}
// in-place sort the b array
for(i=0;i<CLASS_SIZE;i++){
for(j=i+1;j<CLASS_SIZE-1;j++){
if(*b[j-1]>*b[j]){
temp = b[j];
b[j] = b[j-1];
b[j-1] = temp;
}
}
}
}
解决方法是用指向 a 的点初始化 b 数组,然后通过比较 a 数组中的相应值对 b 数组进行就地排序。
简化代码
在您的原始代码中,策略是有一个指针数组 (b) 指向 a 中的元素,然后进行排序。但这在这里是不必要的,因为字符比指针小,所以让 b 成为字符数组更节省空间和更简单。
此外,您的间距非常紧凑,有点难以阅读。这是一个使用 b 作为字符数组而不是指针的解决方案,并提供了改进的间距。此外,没有必要声明上面的函数。定义函数并声明一次就足够了。
#define CLASS_SIZE 10
#include <stdio.h>
void bubbleSortAWriteToB(const char a[], char b[]){
char temp;
int i,j;
// initialize b array to hold pointers to each element in a
for (i = 0; i < CLASS_SIZE; i++){
b[i] = a[i];
}
// in-place sort the b array
for(i = 0; i < CLASS_SIZE; i++){
for(j = i + 1; j < CLASS_SIZE - 1; j++){
if(b[j-1] > b[j]){
temp = b[j];
b[j] = b[j-1];
b[j-1] = temp;
}
}
}
}
int main(void){
int i;
// initialize array
char s_letters[CLASS_SIZE];
char letters[CLASS_SIZE] = {'a','r','p','b','r','c','x','e','w','j'};
// sort array
bubbleSortAWriteToB(letters, s_letters);
// print sorted array
int i;
for (i = 0; i < CLASS_SIZE; i++){
printf("%c\n", s_letters[i]);
}
return 0;
}