对字符串的排序时,应该注意 交换 要用函数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