一
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char** a,char** b)//输入的参数是二级指针(指针的地址)
{
char* temp;//对指针(内容的地址)进行改变
temp= *a;//改变一件事,要传入它的地址,改变地址,就要传入地址的地址
*a= *b;//地址和指针temp等同
*b=temp;
}
int main()
{
char a[50],b[50],c[50];
scanf("%s%s%s",a,b,c);//为什么不用空格 ?
char *p1=a,*p2=b,*p3=c;
if(strcmp(p1,p2)>0) swap(&p1,&p2);// 要交换地址p1,所以swap中的参数是p1的地址
if(strcmp(p1,p3)>0) swap(&p1,&p3);//为什么strcmp中不是*p1,p1可以表示字符串吗??字符数组本来就是第一个字符的地址,p1=a
if(strcmp(p2,p3)>0) swap(&p2,&p3);
printf("%s\n%s\n%s\n",p1,p2,p3);//p1=a,字符数组也用第一个字符的地址表示,所以可以用指针
return 0;
}
二
#include <stdio.h>
#include <math.h>
#include <string.h>
void swap(char **p1, char **p2) {
char *temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
char str[3][20], *p[3];
for(int i = 0; i < 3; i++) {
scanf("%s", str[i]);
p[i] = str[i];
}
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 2 - i; j++) {
if(strcmp(p[j], p[j+1]) > 0) {
swap(&p[j], &p[j+1]);
}
}
}
for(int i = 0; i < 3; i++) {
printf("%s\n", p[i]);
}
return 0;
}