下面这个程序哪里有错,找了好久啊,找不到
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
bool cmp(char* str1,char *str2);
int main()
{
char str1[10][10];
int t;
while(1)
{
scanf("%d",&t);
if(t==0)
break;
int i;
for(i=0;i<t;i++)
scanf("%s",str1[i]);
char * str2[10];
for(i=0;i<t;i++)
str2[i]=str1[i];
sort(&str2[0],&str2[0]+t,cmp);
for(i=0;i<t;i++)
{
printf("%s\n",str1[i]);
}
}
return 0;
}
bool cmp(char* str1,char *str2)
{
return (strcmp(str1,str2)>0);
}
/*
可用测试数据
5
a
b
c
a
b
检验后发现,没有排序,这是为什么?
*/
你是对指针数组(即str2)进行排序,最后得到排序后的索引序列,原字符串并没有被改变。所以,最后不应打印str1,而要打印str2:
for(i=0;i<t;i++)sort(&str2[0],&str2[0]+t,cmp);
bool cmp(char* str1,char *str2)
{
return (strcmp(str1,str2)<0);
}
平时很少用指针,请问,这个参数是怎么传递过去的,是这样吗 char* str1=&str2[0]?
str2[0]本来就是 char *,这样传递的话不就是char ** to char *,不可能成功啊
这样你需要理解sort的工作原理了:sort的三个参数分别是首地址、尾地址和一个比较器。
排序算法需要比较元素的大小,这个比较器就是告诉sort如何比较两个元素的大小。比如,如果sort是用的冒泡算法的话,它会这样实现:
// Peseudo code你的调用写成这样也可以:
sort(str2, str2+t, cmp);这个比较器可以是函数指针,也可以是函数对象或lambda表达式(C++11)。
// function handler看了很久,终于都想明白了,在这儿做点笔记,以后还可以回来看,谢谢哈!
sort(first,last,cmp)前两个参数都为地址,传递到cmp的不是first~last这些地址,而是这些地址所指的内容 ,如 sort(str2, str2+t, cmp);传递到的cmp是str2所指的内容,即str1的地址,strcm(a,b)中,a,b可为字符串,字符数组,也可以是字符串的首地址