(1)输入n个字符串,字符串只能是纯数字或者纯字母,不能事先指定n,最后将字符串倒叙输出。
(2)将纯字母的字符串按字典顺序输出,纯数字的字符串按数字大小输出。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*int partion(char**strs,char** nums,char** chars,int len){//分类函数,将字符串分类成纯数字跟纯字母类型,
int i=0,indexnum=0,indexchar=0;
for(i=0;i<len;i++){
if((strs[i][0]>='0')&&strs[i][0]<='9'){
indexnum++;
nums=(char**)realloc(nums,indexnum*sizeof(char*));
nums[indexnum-1]=(char*)malloc(strlen(strs[i])*sizeof(char));
strcpy(nums[indexnum-1],strs[i]);
}else{
indexchar++;
chars=(char**)realloc(chars,indexchar*sizeof(char*));
chars[indexchar-1]=(char*)malloc(strlen(strs[i])*sizeof(char));
strcpy(chars[indexchar-1],strs[i]);
}
}
return indexnum;
}*/
void printonsort(char** p,int len){//将字符串按序排好并输出
int i=0,j;
char *k=NULL;
for(i=1;i<len;i++){
k=(char*)realloc(k,strlen(p[i])*sizeof(char));
strcpy(k,p[i]);
j=i-1;
while((j>=0)&&(strcmp(p[j],k)>0)){
strcpy(p[j+1],p[j]);j--;
}
strcpy(p[j+1],k);
}
for(i=0;i<len;i++){
printf("%s\n",p[i]);
}
free(k);
}
int main(void){
char c;
char *str=NULL;
char **strs=NULL;
int count=0,strnums=0,i=0;
while(scanf("%c",&c)!=EOF){
if(((c==' ')||(c=='\n'))&&count!=0){
strnums++;
strs=(char**)realloc(strs,strnums*sizeof(char*));
strs[strnums-1]=malloc(strlen(str)*(sizeof(char)));
strcpy(strs[strnums-1],str);
strs[strnums-1][count]='\0';
count=0;
}else if((c!=' ')&&c!='\n'){
count++;
str=(char*)realloc(str,count*sizeof(char));
str[count-1]=c;
}
}
i=strnums-1;
while(i>=0){
printf("%s ",strs[i--]);
}
printf("\n");
char**nums=NULL,**chars=NULL;
int indexnum=0,indexchar=0;
for(i=0;i<strnums;i++){
if((strs[i][0]>='0')&&strs[i][0]<='9'){
indexnum++;
nums=(char**)realloc(nums,indexnum*sizeof(char*));
nums[indexnum-1]=(char*)malloc(strlen(strs[i])*sizeof(char));
strcpy(nums[indexnum-1],strs[i]);
}else{
indexchar++;
chars=(char**)realloc(chars,indexchar*sizeof(char*));
chars[indexchar-1]=(char*)malloc(strlen(strs[i])*sizeof(char));
strcpy(chars[indexchar-1],strs[i]);
}
}
printonsort(chars,indexchar);
printonsort(nums,indexnum);
return 0;
}
理解:题目要求输入n个字符串,并且在n不知情的条件下接受字符串,所以只能通过动态的数组来接受字符串。
共有两个动态数组:char**p数组,以及p[i]数组。
第一个数组根据(c==’ ‘||c==’\n’)&&count!=0(count为当前接受的字母或数字个数。)来动态更新,并且在更新中将count置零,方便下次接受数据。
第二个数组更新动态更新的判定比较明显==不写了。
提示点:本来划分数据的时候我是携程分类函数的方法来分类的,后来发现,传送进去的两个char**p指针变量在函数内完成划分后,函数结束两个变量依旧没有获得数据。这种指针数据的传递方法要记住–是不可行的….考点。具体方法可以看partion函数内容。