(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函數內容。