华科大2012机试2

(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函数内容。

点赞