题目描述
已知正整数n,n的范围是1—100。你要从键盘读入n个字符串,每个字符串的长度不确定,但是n个字符串的总长度不超过100000。你要利用字符指针数组将这n个字符串按照ASCII码顺序进行升序排序,然后再打印到屏幕上。字符串中可能包含ASCII码中的任意字符,每个字符串以换行符结束输入。
要求:不允许定义如char str[100][100000];这样的二维数组,因为会极大的浪费内存空间。你应定义char str[100000];这样的存储空间,将n个字符串连续的存储在一维字符空间内,然后将这n个字符串的起始位置保存在字符指针数组中,再进行排序操作。
输入与输出要求:输入一个正整数n,代表待排序字符串的个数,n不超过100,然后是n个字符串,每个字符串的长度不确定,但至少包含1个字符。n个字符串的总长度不会超过100000。输出排序后的n个字符串,每个字符串占一行。
程序运行效果:
Sample 1:
4↙
Where there is hope ,there is a way.↙
Welcome Beijing.↙
Nice idea.↙
Have fun.↙
Have fun.↙
Nice idea.↙
Welcome Beijing.↙
Where there is hope ,there is a way.↙
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STRLEN 100300
int sort(char* ptr_a[],int last);
int swapPtr(char ** aptr, char ** bptr);
int main(){
int n,i;
char str[STRLEN];
char* str_ptr = str;
char* ptr_array[100]={NULL};
scanf("%d",&n); getchar();
for(i=0;i<n;i++){
gets(str_ptr);
ptr_array[i] = str_ptr;
while(*str_ptr) {str_ptr++; }
str_ptr++; }
sort(ptr_array, n-1);
for(i=0;i<n;i++){ puts(ptr_array[i]);
}
return 0;
}
int sort(char* ptr_a[],int last){
int i=0,j=0,min=0;
for(i=0; i<last; i++) {//选择排序
for(j=i,min=i; j<=last; j++) {
if(strcmp(ptr_a[j],ptr_a[min]) <0 ) min=j;
}
if (min != i) swapPtr(&ptr_a[i],&ptr_a[min]);
}
}
int swapPtr(char ** aptr, char ** bptr) {
char * tmp=NULL;
tmp = *aptr;
*aptr = *bptr;
*bptr = tmp;
return 0;
}