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]); 
    } 
} 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/17684.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论