输入三个字符串,按由小到大的顺序输出。分别使用指针和引用方式实现两个排序函数。在主函数中输入和输出数据。
输入三个字符串,按由小到大的顺序输出。分别使用指针和引用方式实现两个排序函数。在主函数中输入和输出数据。
3行字符串
按照从小到大输出成3行。由指针方式实现。
cde
afg
abc
abc
afg
cde
答案:
#include
#include
/*
int main()
{
void sort1(char *p1,char *p2,char *p3);
char s1[100],s2[100],s3[100];
char *p1,*p2,*p3; // char *p[3]; p[1]=s1;p[2]=s2;p[3]=s3;
gets(s1);
gets(s2);
gets(s3);
p1=s1;
p2=s2;
p3=s3;
sort1(p1,p2,p3);
printf("%s\n",p1);
printf("%s\n",p2);
printf("%s\n",p3);
return 0;
}
void sort1(char *p1,char*p2,char *p3)
{
char *temp=NULL;
if(strcmp(p1,p2)>0)
{
temp=p1;
p1=p2;
p2=temp;
}
if(strcmp(p1,p3)>0)
{
temp=p1;
p1=p3;
p3=temp;
}
if(strcmp(p2,p3)>0)
{
temp=p2;
p2=p3;
p3=temp;
}
}
在数出结果的时候为什么还是原来的状态,没有改变??! 但是调试运行命名交换了呀!(讨厌!!)
如果你恰好遇到这种问题 那么看看下面这个列子
/*
(1)void swaps(int *a,int *b)
{*/
(2)void swaps(int *a,int *b)
{
int *c;
c=a;
a=b;
b=c;
}
}
结果为第一种没有交换,而第二种成功交换,看看两个swaps()的区别在哪??
显然 第一种 交换的数值地址没在交换地址的过程中,地址中的值也跟着地址走了,也就是说地址中所包含的值没有并没有交换;
相反,第二种方法交换了地址中值,
好比 p1瓶中装着苹果,p2瓶中装着梨,第一种方法交换的是p1瓶和p2瓶的位置
p 1苹果 | p2梨 |
转为
p2梨 | p1苹果 |
而第二种
p1(苹果) | p2(梨) |
转为
p1(梨) | p2(苹果) |
SO 最上面的题的正确解法为
#include
#include
void sort1(char *p1,char *p2,char *p3)
{
char t[100];
if(strcmp(p1,p2)>0)
{
strcpy(t,p1);
strcpy(p1,p2);
strcpy(p2,t);
}
if(strcmp(p1,p3)>0)
{
strcpy(t,p1);
strcpy(p1,p3);
strcpy(p3,t);
}
if(strcmp(p2,p3)>0)
{
strcpy(t,p2);
strcpy(p2,p3);
strcpy(p3,t);
}
}
int main()
{
void sort1(char *,char *,char *);
char s1[100],s2[100],s3[100];
char *p1,*p2,*p3;
gets(s1);
gets(s2);
gets(s3);
p1=s1;
p2=s2;
p3=s3;
sort1(p1,p2,p3);