改为如下正确答案: #include <stdio.h> #include <string.h> main() { char str1[20],str2[20],str3[20];//指针数组中,各元素之值只能为指针(地址)。所以改原来的*str1[20],*str2[20],*str3[20]为str1[20],str2[20],str3[20] void swap();//函数原型 printf("Input 3 lines:/n"); gets(str1); gets(str2); gets(str3); if(strcmp(str1,str2)>0) swap(str1,str2); if(strcmp(str1,str3)>0) swap(str1,str3); if(strcmp(str2,str3)>0) swap(str2,str3); printf("Now, the order is:/n"); printf("%s/n%s/n%s/n",str1,str2,str3); } void swap(char *p1,char *p2)//无需返回值,所以改原来的char为void { char p[20];//指针数组中,各元素之值只能为指针(地址)。所以改原来的*p[20]为p[20] strcpy(p,p1); strcpy(p1,p2); strcpy(p2,p); } 如一定要用到指针数组的话,见如下程序: #include <stdio.h> #include <string.h> main() { char *arr[3];//指针数组,表示元素arr[0]、arr[1]、arr[2]内存储的为指针(地址)。 void swap(); char str1[20],str2[20],str3[20]; int i; printf("Input 3 lines:/n"); gets(str1); gets(str2); gets(str3); arr[0]=str1; arr[1]=str2; arr[2]=str3;//arr[0]、arr[1]、arr[2]分别用于存储字符串数组str1、str2、str3的首地址 printf("Source order is:/n"); for(i=0;i<3;i++) puts(arr[i]); if(strcmp(arr[0],arr[1])>0) swap(arr[0],arr[1]); if(strcmp(arr[0],arr[2])>0) swap(arr[0],arr[2]); if(strcmp(arr[1],arr[2])>0) swap(arr[1],arr[2]); printf("Now, the order is:/n"); printf("%s/n%s/n%s/n",arr[0],arr[1],arr[2]); } void swap(char *p1,char *p2) { char p[20]; strcpy(p,p1); strcpy(p1,p2); strcpy(p2,p); }