C語言中字符串數組排序問題

對字符串的排序時,應該注意 交換 要用函數strcpy覆蓋字符串的內容進行交換,不同於簡單的數字交換。

1.

這是用選擇排序法對一個整型數組進行從大到小的排序;

//選擇排序法
#include <stdio.h>
#define N 5
int main(){
	int a[N]={4,5,2,3,1};
	int i,j,k,temp;
	for(i=0;i<N-1;i++){
		k=i;
		for(j=i+1;j<N;j++){
			if(a[k]<a[j])  
				k=j;
		}
//
		if(k!=i){ 
			temp=a[k];
			a[k]=a[i];
			a[i]=temp;
		}
	}
	for(i=0;i<N;i++) printf("%d",a[i]);
	return 0;
}

2.

參照上面的排序方法對字符串數組排序,會發現有報錯;

#include <stdio.h>
#include <string.h>
int main(){
    char a[4][4]={"bbb","aaa","ttt","qqq"},temp[20];
    int i,j,k;
    for(i=0;i<4;i++){
        k=i;
        for(j=i+1;j<5;j++){
            if(strcmp(a[k],a[j])>0)
                k=j;
        }

        if(k!=i){  					//此處進行交換,出錯;
            temp=a[k];
            a[k]=a[i];
            a[i]=temp;
        }
    }
    printf("After sorted:");
    for(i=0;i<5;i++){
        printf("%s\n",a[i]);
    }
}
/*
[Error] incompatible types in assignment of 'char [4]' to 'char [19]'*/

錯誤的原因在於,用二維數組 a [5] [5] 存放字符串的時候,對於每一個字符串:a[0] 、a[1]…裏面存放的是一個字符串的地址,同時也是a[0]、a[1]…本身的地址;

用代碼解釋就是:

#include <stdio.h>
int main(){
	char a[20][20]={"abc","def"};
	printf("%d-%d\n",a[0],a[1]);
	;
	printf("%d-%d\n",&a[0],&a[1]);
	return 0;
} 

就是a[0] = &a[0]

結果

本來就是這樣,數組在內存是連續的,所以想要交換裏面的值——地址,肯定是錯誤的。

3.正確的方法之一是用函數strcpy覆蓋字符串的內容進行交換;

#include <stdio.h>
#include <string.h>
int main(){
    char a[5][20];
    int i,j,k;
    for(i=0;i<5;i++){
        scanf("%s",a[i]);
    }
    for(i=0;i<4;i++){
        k=i;
        for(j=i+1;j<5;j++){
            if(strcmp(a[k],a[j])>0)
                k=j;
        }
       										//修改後的部分
        if(k!=i){
            char temp[100];
            strcpy(temp, a[k]);
            strcpy(a[k], a[i]);
            strcpy(a[i], temp);
        }
    }
    printf("After sorted:");
    for(i=0;i<5;i++){
        printf("%s\n",a[i]);
    }
}

4.還有一種思路,加入另一個指針數組,對應指向二維數組,再把指針數組裏的指針進行排序,最後輸出依次整個指針數組。

這樣爲什麼可以讓裏面的地址進行交換?

原因:指針數值裏放的的指針 p[ 0 ] 、p[ 1 ]…不等於 &p[0]、&p[ 1 ]…所以可以進行交換。

#include <stdio.h>
int main(){
	char a[4][4]={"bbb","aaa","ccc","ddd"};
	char *p[4];
	int i;
	for(i=0;i<4;i++){
		p[i]=a[i];
	}
	printf("%d-%d\n",p[0],p[1]);
	printf("%d-%d\n",&p[0],&p[1]);
	return 0;
} 

在這裏插入圖片描述

#include <stdio.h>
#include <string.h>
int main(){
    char a[4][4]={"bbb","aaa","ttt","qqq"};
    char *pStr[4],*temp; 				//定義另外一個指針數組;
    int i,j;
    for(i=0;i<4;i++){
    	pStr[i]=a[i];      				//讓指針數組內容對應指向二維數組a;
	}
    for(i=0;i<4-1;i++){
        for(j=i+1;j<4;j++){				//直接進行交換指針數組裏面的值——地址;
            if(strcmp(pStr[i],pStr[j])>0){
            	temp = pStr[i];
				pStr[i] = pStr[j];
				pStr[j] = temp; 
			}
        }
    }
    printf("After sorted:\n");
    for(i=0;i<5;i++){
        printf("%s\n",pStr[i]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章