注意陷阱:
1. 字符串中的数字如果很长,会超出int的界限;涉及到大数问题的处理
2. 如果从字符串中提取出来的数字是以0开头的,要消去前面的0
3. 大数问题的排序问题
4. scanf()处理回车,getchar();scanf()与gets的冲突问题
输入字符串时,scanf()或cin>>遇到空格、回车、Tab结束,但在缓冲区中还留着这些结束符,此后如果使用gets()想去获取下一行字符串,它碰到的却是前面遗留下来的回车(或者回车之前还有空格等空白符),那么这次gets()就直接失效了。所以就出现了常碰到的第一个字符串变成空白字符串的现象。
思路:
1. 从字符串中提取数字
2. 消除数字首部的0
3. 数字字符串排序,先比较长度排序;若长度相等,再调用strcmp比较排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void GetNumString(char *s, int n, char *number)
{
int i,j;
i=j=0;
while(i<n)
{
if(s[i]>='0' && s[i]<='9')
number[j++] = s[i];
i++;
}
number[j]='\0';
}
void DeleteZeroOfNum(char *number, int n)
{
int i;
i=0;
while(i<n-1 && number[i] == '0')
{
i++;
}
int k,m;
k = i;
m = 0;
while(number[k]!='\0')
{
number[m++] = number[k++];
}
number[m]='\0';
}
void SortOfNumStr(char *strOfNum[],int n)
{
char *temp;
for(int i=0;i<n;i++)
for(int j=1;j<n-i;j++)
if( strlen(strOfNum[j-1]) < strlen(strOfNum[j]) )
{
temp = strOfNum[j-1];
strOfNum[j-1] = strOfNum[j];
strOfNum[j] = temp;
}
else if( strlen(strOfNum[j-1]) == strlen(strOfNum[j]))
{
if( strcmp(strOfNum[j-1],strOfNum[j])<0)
{
temp = strOfNum[j-1];
strOfNum[j-1] = strOfNum[j];
strOfNum[j] = temp;
}
}
}
int main()
{
char *string[10],*numstr[10];
int n;
scanf("%d",&n);
if(n<=0 || n>10)
return 0;
getchar();
for(int i=0;i<n;i++)
{
string[i] = (char *)malloc(50);
numstr[i] = (char *)malloc(50);
gets(string[i]);
GetNumString(string[i],strlen(string[i]),numstr[i]);
DeleteZeroOfNum(numstr[i],strlen(numstr[i]));
}
SortOfNumStr(numstr,n);
for(int j=0;j<n;j++)
printf("%s\n",numstr[j]);
getchar();
return 0;
}