今天我尝试对多维阵列进行排序,但我无法弄清楚,为什么它无法正常工作。
算法执行第一个字母的交换,但不会交换整个字符串。这是一个有效的DEMO,它表明该算法按字母顺序打印每个找到的字符串的首字母。
用于交换整个字符串的算法不仅仅是第一个字母,不起作用:
#include <stdio.h>
#include <string.h>
int main(void){
char arr[][10] = {"Michael" , "Tanja" ,"Adda", "Jenny", "Kimberly", "Walter" , "Donna"};
size_t length = sizeof arr / sizeof *(arr + 0);
unsigned int i,j, k=0;
char *tmp;
for (i = 0 ; i < length-1; i++){
for (k = 0 ; k < length-i-1; k++){
if (arr[k][0] > arr[k+1][0]){
tmp = arr[k];
strcpy(arr[k], arr[k+1]);
strcpy(arr[k+1], tmp);
}
}
}
printf("Sorted Array:\n");
for ( j = 0 ; j < length ; j++ ){
printf("%s ", arr[j]);
}
printf("\n\n");
return 0;
}
我得到的输出是:
Adda Adda Adda Donna Donna Donna Donna
应该是:
Adda Donna Jenny Kimberly Michael Tanja Walter
答案 0 :(得分:4)
tmp
只是一个指针。因此,在分配tmp = arr[k];
和后续strcpy()
期间,由于arr[k]
被arr[k+1]
覆盖而导致其丢失。但是你需要在交换期间复制字符串。所以使用缓冲区:
char tmp[256];
和
strcpy(tmp , arr[k]);
strcpy(arr[k], arr[k+1]);
strcpy(arr[k+1], tmp);
答案 1 :(得分:3)
tmp = arr[k];
由于tmp
指向arr[k]
,在arr[k+1]
中复制arr[k]
并在后者中复制tmp
后,您得到的值与{{1}相同本身已修改(arr[k]
指向此修改后的值)。
你可以这样做 -
tmp