《编程思维与实践》1024.字串排序
题目
思路
关键点:判断字符串是否包含数字,含数字时提取出数字大小.
用一个结构体存字符串首地址和数字大小,当不含数字时数字大小记为-1(因为数字大小可能为0).
由于输入字符串的个数不确定,故需要用scanf的EOF来判断输入结束.
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
typedef struct{ int number;char *s;} Data;
int cmp(const void *a,const void *b)
{
Data *m=(Data*)a;
Data *n=(Data*)b;
if(m->number==n->number) //数字相同或不含数字
{
return strcmp(m->s,n->s);
}
else if(m->number!=-1&&n->number==-1) //m含数字,n不含数字 n排在前
{
return 1;
}
else if(m->number==-1&&n->number!=-1) //m不含数字,n含数字 n排在后
{
return -1;
}
else{
return m->number-n->number; //数字不同但都含数字
}
}
int main()
{
char s1[100][31]; //长度不超过30
Data tab[100]; //不超过100个字符串
int i=0;
int count=0; //统计有多少个字符串
while(scanf("%s",s1[i])!=EOF)
{
tab[i].s=s1[i];
tab[i].number=-1;
int flag=-1; //判断是否有数字
int j;
for(j=0;j<strlen(s1[i]);j++)
{
if(isdigit(s1[i][j]))
{
flag=1;
break;
}
}
if(flag==1)
{
tab[i].number=atoi(s1[i]+j); //数字连续存储
}
i++;
count++;
}
qsort(tab,count,sizeof(Data),cmp);
for(int j=0;j<count;j++)
{
printf("%s ",tab[j].s);
}
return 0;
}