HOHO,下面的程序要求是,输入3个字符串,按由小到大的顺序输出。
偶第一次用指针,知道我的程序有无数个错误,但是不明白确切错在哪里,请高手指教。
虚心学习ing~~
===============// test.cpp : Defines the entry point for the console application.
////#include "stdafx.h"
#include <stdio.h>
#include <string.h>void swap(char *p1,char *p2)
{
char *p3=0;
*p3=*p1;*p1=*p2;*p2=*p3;
}void main()
{
char *pointer_1=0,*pointer_2=0,*pointer_3=0;
gets(pointer_1);
gets(pointer_2);
gets(pointer_3);
if (strcmp(pointer_1,pointer_2)>0)swap(pointer_1,pointer_2);
if (strcmp(pointer_1,pointer_3)>0)swap(pointer_1,pointer_3);
if (strcmp(pointer_2,pointer_3)>0)swap(pointer_2,pointer_3);
puts(pointer_1);
puts(pointer_2);
puts(pointer_3);
}

解决方案 »

  1.   

    如果不是我没分用了,我才不会回答这种该你自己回答的问题呢。
    1、*p3=*p1;*p1=*p2;*p2=*p3;
    改成p3=p1;p1=p2;p2=p3;
    2、有十年年没用过gets函数了,如果我没有记错的话,该函数不会自动开辟一块内存供你用,换言之,你这样用是不行的,换成
     char buf1[100];
              char buf2[100];
              char buf3[100];
              pointer_1=buf1;
              pointer_2=buf2;
              pointer_3=buf3;
      

  2.   

    就算这样改,程序仍然有错,现在给出正确答案
    #include <stdio.h>
    #include <string.h>void swap(char **p1,char **p2)
    {
    char *p3;
    p3=*p1;*p1=*p2;*p2=p3;
    }void main()
    {
             char buf1[100];
             char buf2[100];
             char buf3[100];
             char* pointer_1=buf1;
             char* pointer_2=buf2;
             char* pointer_3=buf3; gets(pointer_1);
    gets(pointer_2);
    gets(pointer_3);
    if (strcmp(pointer_1,pointer_2)>0)
    swap(&pointer_1,&pointer_2);
    if (strcmp(pointer_1,pointer_3)>0)
    swap(&pointer_1,&pointer_3);
    if (strcmp(pointer_2,pointer_3)>0)
    swap(&pointer_2,&pointer_3); puts(pointer_1);
    puts(pointer_2);
    puts(pointer_3);
    }//看起来挺复杂,你可以使用引用的方法
      

  3.   

    //看看这个程序对你有没有用
    //程序目的:排序指针数组
    #include<iostream>
    #include<string>
    using namespace std;void Sort(char *p[],int n);char *Subject[]={
    "C",
    "C++",
    "Basic",
    "Pascal",
    "MFC",
    "VCL",
    "STL",
    0
    };int main(void)
    {
     char *ps=0;int i=0;
     char **pSubject=Subject; Sort(Subject,7);
     cout<<"Displaying the subject array...\n"<<endl;
     
     //while(i<7)cout<<"NO."<<i<<" subject:  "<<*(Subject+i++)<<endl; //不能这样写:cout<<"NO."<<i<<" subject:  "<<*((Subject+i)++))<<endl; 因为++运算符只能作用于变量,不能是表达式。 
     
     //while(i<7)cout<<"NO."<<i<<" subject:  "<<Subject[i++]<<endl;  
     
     //while(i<7){ps=Subject[i++];cout<<"NO."<<i<<" subject:  "<<ps<<endl;}
     
     //while(i<7){ps=*(Subject+i++);cout<<"NO."<<i<<" subject:  "<<ps<<endl;}
     
     //while(i<7){pSubject=Subject+i++;cout<<"NO."<<i<<" subject:  "<<*pSubject<<endl;}
     
     //while(i<7){pSubject=&Subject[i++];cout<<"NO."<<i<<" subject:  "<<*pSubject<<endl;}
     
     //while(*pSubject!=0)/*此句不能这样写: while(pSubject!=0)*/cout<<"NO."<<i++<<" subject:  "<<*pSubject++<<endl;   //for(i=0;i<7;i++)cout<<"NO."<<i<<" subject:  "<<*(Subject+i)<<endl; //for(i=0;i<7;i++)cout<<"NO."<<i<<" subject:  "<<Subject[i]<<endl;
     
     //for(i=0;i<7;i++){pSubject=Subject+i;  cout<<"NO."<<i<<" subject:  "<<*pSubject<<endl;}
     
     for(i=0;*pSubject!=0;i++)cout<<"NO."<<i<<" subject:  "<<*pSubject++<<endl; cout<<"\nDisplaying the subject array is completed."<<endl;//更多方法可自己进行推断
     return 0;
    }void Sort(char *p[],int n)
    {
     char *pTemp;
     int nSign;
     for(int i=0;i<n-1;i++)
     {
      nSign=i;
      for (int j=i+1;j<n;j++)
      if(strcmp(p[nSign],p[j])>0) 
         nSign=j;
      if(nSign!=i)
      {
       pTemp=p[nSign];
       p[nSign]=p[i];
       p[i]=pTemp;
      }
     }
    }
    /*小结:p++ 或++p会改变指针变量自身的值(地址), p+1 不会改变指针变量自身的值;(*p)++ 或++(*p)或 ++*p 会改变指针变量指向的变量的值,*p+1不会改变指针变量指向的变量的值*/
      

  4.   

    看来指针永远是个迷人的问题哈请记住:
    1.指针是一种数据类型。无论它是指向哪种类别的变量,它自身的长度是一样。2。使用指针时请注意:  无论什么情况下
         *(。。)是取{。。}的内容
        &(..)是取(..)的地址
        既无 * 也无 &,直接使用指针名是取该指针指向的地址
        指针可以做算术运算(+、-),以所指向的类型的长度为基本单位改变。
        *的优先级比 ++ 高。3.紧记2中的原则,那么下面的例子你都会觉得理所当然,很容易。
      eg : sort* p;//sort是一种数据类型,可以是int,float,char,string ,or class_name...
         下面以int为例;
         int n = 10;
         int* p = &n;//&是取地址,&n就是取n的地址,即把n的地址赋给指针p
         int n1 = *p;//*是取内容,so, n1 = p指向的内容,即n;so n1 == n == 10
         cout<< p <<endl;//直接使用指针名是取该指针指向的地址,即n的地址addr_n
         cout << &n << endl;//上句输出的结果和该句相同。下句则和该句不同
         cout << &p <<endl;//取该指针地址,即p自身的地址addr_p     p += 2;
         cout << P << endl; //输出addr_n + 2*lengthof(int)
         cout << &p << endl;//输入仍然为addr_p,因为该指针变量的地址自一开始就分配好了,在运行期间始终不变。     //回到 p =&n;
         *p++;//和任何自增表达式相同,该表达式的含义有二:1。表达式的值为*p,即10;   2。该表达式过后,p++,即p指向下一个int
         (*P)++;//和任何自增表达式相同,该表达式的含义有二:1。表达式的值为*p,即10;  2。该表达式过后,p指向的内容++, 即n = 11;
         ++*p;++(*p);是对应的前缀表达     
    以上是自己的一点体会,请高手指教!