题目不想说了。
主要就是当数字相等的时候,需要通过strcmp来判断。
这里告诉我们,在分类的时候,一定要把所有的情况都考虑清楚。
#include <stdio.h> #include <stdlib.h> #include <string.h> /* 1. 输入数据 2. 提取字符串中的数字 int number(char *str); 3. 编写比较函数 int strnumcmp(const void *a, const void * b); 4. 调用qsort函数对字符串排序 5. 输出 */ char record[110][40]; long number(char * str); int cmp(const void *a, const void *b); int main() { int count; int k; char tmp_input[40]; //initialization count = 0; while( scanf("%s",record[count])!=EOF ){ count++; } qsort(record,count,sizeof(record[0]),cmp); for(k=0;k < count-1;k++){ printf("%s ",record[k]); } printf("%s\n",record[k]); } long number(char *str){ long tmp; int flag; // flag == 1 的时候代表这个字符串里面有数字,==0 的时候,表示没有数字; // initialization flag = 0; tmp = 0; int k = 0; while(str[k] != '\0'){ if('0' <= str[k] && str[k] <= '9'){ flag = 1; tmp = tmp * 10 +((str[k]) - '0'); } k++; } if(flag == 0) return -1; return tmp; } int cmp(const void *a, const void *b){ if(number((char*)a) != -1 && number((char *)b)!=-1){ if(number((char*)a) != number((char *)b)){ if(number((char*)a) < number((char *)b)){ return -1; } else return 1; } else return strcmp((char*)a,(char*)b); } else if(number((char*)a) == -1 && number((char *)b) == -1 ){ return strcmp((char*)a,(char*)b); } else if(number((char*)a) == -1 && number((char *)b) != -1){ return -1; } else if(number((char*)a) != -1 && number((char *)b) == -1){ return 1; } }