题析:
1
直接开char a[][]内存不够;
所以先开一个二级指针
二级指针指向的存字符串的一级指针的地址;
2
排序:
选择排序:从排前面
冒泡排序:从后面排
3
在交换时可以直接对拷首地址
用strcpy会超时,又或者会空间不够。
知识点:
char a[ ]
a不需要空间来存地址,因为他是常量(某个地址)
因此不可以对a赋值,char a[6]={"sdsada"};会对a所表示的地址逐个写入。
char*a a="CHINA";
CHINA有地址,然后,赋值后,a指向首地址。
char* a[] (a先于[]结合)
在内存中分配了固定的地址(a—首地址)来存*a[],因此不能用给a赋值。
但是可以给a[]赋字符串
char**a
a保存的是一级指针的地址,所以不能用a=“china”。
对于char* a[] 中的a[0]可以直接:
*a[0]=“xxx”;
但是char **a不可以,因为a还未分配内存,不知道指向什么,打印时先会访问a。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char **p;
char str[100002];
int n,len;
int i,j,k;
scanf("%d",&n);
getchar();
p=(char**)malloc(n*sizeof(char*));
for(i=0;i<n;i++){
gets(str);
len=strlen(str);
*(p+i)=(char*)malloc(len+1);
memset(*(p+i), 0,len+1);
strcpy(*(p+i),str);
}
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++){
if(strcmp(*(p+j),*(p+k))>0){
char *t;
// strcpy(t,*(p+j));
// strcpy(*(p+j),*(p+k));
// strcpy(*(p+k),t);
t=*(p+j);
*(p+j)=*(p+k);
*(p+k)=t;
}
}
for(i=0;i<n;i++){
puts(*(p+i));
free(*(p+i));
}
free(p);
}