棱怎么读:指针数组,排序,创建一个长度为size的动态指针数组,然后从键盘读取size个学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中
来源:百度文库 编辑:偶看新闻 时间:2024/04/28 05:00:24
26.指针数组,排序,创建一个长度为size的动态指针数组,然后从键盘读取size个学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中
#include
#include
#define N 20
/*创建一个长度为size的动态指针数组,然后从键盘读取size个
学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中。*/
char ** inputName(int);
void sort(char *[], int); //函数功能:对字符串进行排序。
void printName(char *[], int); //函数功能:依次输出指针数组元素所指向的字符串。array指向的数组元素。
void freeName(char * [],int); //函数功能:释放本程序中动态申请的内存。
main()
{
int size; //size表示要排序的人数
char **array;
printf("请输入要排序的人数:\n");
scanf("%d",&size);
printf("请输入%d个学生的名字,每输入一个用回车键结束:\n",size);
//从键盘读取size个学生的名字存储在字符数组中
array=inputName(size);
//对字符串进行排序
sort(array,size);
printf("从小到大,这%d个学生的姓名为:",size);
//打印出size个学生的名字
printName(array,size);
system("pause");
//释放动态数组的内存空间
freeName(array,size);
system("pause");
return 0;
}
/*创建一个长度为size的动态指针数组,然后从键盘读取size个
学生的名字存储到字符数组中,字符数组首元素地址存储到指针数组元素中。*/
char **inputName(int size)
{
int inputch(char [],int); //读取字符串并返回其长度
char ** array;
char string[N]; //将读取的字符串暂时存储在string数组中
int i,length;
//申请动态指针数组的内存空间
array=(char **)malloc(sizeof(char*)*size);
if(array!=NULL){
for(i=0;i<=size;i++){
length=inputch(string,N); //读取字符串
*(array+i)=(char *)malloc(sizeof(char*)*length);
if(*(array+i)!=NULL)
strcpy(*(array+i),string); //将字符串string中的字符拷贝到*(array+i)中
}
}
return array; //返回动态指针数组的首地址
}
//函数功能:对字符串进行排序。
void sort(char *a[], int size)
{
int strCmp(char*,char*); //比较两个字符串的大小
char *tempPtr;
int i,j,min;
/*使用选择法排序, 外循环每循环一次,确定name[i]的值*/
for(i=0; i<= size-1; i++){ /*外循环:确定a[i]的值*/
/*从a[i]~a[size-1]所指向的串中选出最小串,由a[min]指向*/
min=i;
for(j=i+1; j<=size; j++)
if(strCmp(a[min], a[j])>0) /*存在更小的串*/
min=j;
/*交换a[min]和a[i],使a[i]指向a[i]~a[size-1]所指向的串中的最小串*/
if(min!=i){
tempPtr= a[i];
a[i]= a[min];
a[min]=tempPtr;
}
}
}
/*s指向的串大于t指向的串,返回1;小于,返回-1;等于,返回0*/
int strCmp(char * s,char * t)
{
while(*s!='\0' && *t!='\0' && *s==*t){
s++;
t++;
}
if(*s==*t) //若结束比较时s和t所指字符相等,则肯定指向‘\
return 0;
else if(*s>*t)//任何一个字符均大于‘\
return 1;
else
return -1;
}
//函数功能:依次输出指针数组元素所指向的字符串。array指向的数组元素。
void printName(char * array[], int size)
{
int i;
for(i=0;i<=size;i++)
printf("%s\n",array[i]);
}
//函数功能:释放本程序中动态申请的内存。
void freeName(char *array[],int size)
{
int i;
for(i=0;i<=size;i++){
free(*(array+i));
}
free(array);
}
//函数功能:读取字符串并返回其长度
int inputch(char string[],int size)
{
char ch;
int length=0;
scanf("%c",&ch);
while(ch!='\n'){
string[length]=ch;
scanf("%c",&ch);
length++;
}
string[length]='\0';
return length;
}