常犯的指针问题(一)Problem N: 输入三个字符串,按由小到大的顺序输出—C语言

Description

输入三个字符串,按由小到大的顺序输出。分别使用指针和引用方式实现两个排序函数。在主函数中输入和输出数据。

Input

3行字符串

Output

按照从小到大输出成3行。由指针方式实现。

Sample Input

cde
afg
abc

Sample Output

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)

{
    int c;
    c=*a;
    *a=*b;
    *b=c;
}

*/

(2)void swaps(int *a,int *b)
 {


     int *c;


     c=a;
     a=b;
     b=c;
 }

 int main ()
 {


     int a=0,b=1;
     swaps(&a,&b);
     printf ("%d %d",a,b);


 }


结果为第一种没有交换,而第二种成功交换,看看两个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);


  printf("%s\n",s1);
  printf("%s\n",s2);
  printf("%s\n",s3);
     return 0;

 }



你可能感兴趣的:(常犯的指针问题(一)Problem N: 输入三个字符串,按由小到大的顺序输出—C语言)