将字符串里的数字和字母分别输出再排序

img

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fenlei(char all[][100],int n,char zm[][100],char nmb[][100],int *nzm,int *nsz)
{
    int i;
    int k=0,m=0; //记录数字和字母数组的个数
    int o=0,p=0,q=0;

    for (i=0;i<n;i++)
    {
        o=0;p=0;q=0;
        while(all[i][o])
        {
            if(all[i][o] >='0' && all[i][o]<='9')
                nmb[k][p++] = all[i][o];
            else if(all[i][o] >='0' && all[i][o]<='9')
                zm[m][q++] = all[i][o];

            o++;
        }
        nmb[k][p] = 0;
        zm[m][q] = 0;
        k++;
        m++;
    }
    *nzm = m;
    *nsz = k;
}


//选择排序,升序
void select_sort(int a[],int n)
{
    int i,j;
    int minindex,tmp;
    for (i=0;i<n-1;i++)
    {
        minindex = i;
        //找出第i小的数所在的位置
        for(j=i+1;j<n;j++)
        {
            if(a[j] < a[minindex])
                minindex = j;
        }

        //将第i小的数放在第i个位置
        if (i != minindex)
        {
            tmp = a[i];
            a[i] = a[minindex];
            a[minindex] = tmp;
        }
    }

}



//冒泡排序
void bubble_sort(char a[][100],int n)
{
    int i,j;
    char t[100];
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if(strcmp(a[j], a[j+1]) > 0)  //从小到大,升序
            {
                memset(t,0,100);
                memcpy(t,a[j],strlen(a[j]));
                memset(a[j],0,100);
                memcpy(a[j],a[j+1],strlen(a[j+1]));
                memset(a[j+1],0,100);
                memcpy(a[j+1],t,strlen(t));
            }
        }
    }
}


int main()
{
    int i,n;
    int nmbsz = 0,nmbzm = 0; //数字和字母的组数
    char all[30][100],nmb[30][100],zm[30][100];
    int sz[30]; //保存转换后的数字
    printf("请输入字符串的个数:");
    scanf("%d",&n);
    printf("请输入%d个字符串:\n",n);
    for(i=0;i<n;i++)
        scanf("%s",all[i]); //读取一行字符串
    
    //分类
    fenlei(all,n,zm,nmb,&nmbzm,&nmbsz);
    //将数字字符转成数字
    for(i=0;i<nmbsz;i++)
        sz[i] = atoi(nmb[i]);
    //数字排序
    select_sort(sz,nmbsz);

    //将字母字符串排序
    bubble_sort(zm,nmbzm);

    //显示
    printf("排序后的字母:\n");
    for (i=0;i<nmbzm;i++)
    {
        printf("%s\n",zm[i]);
    }
    printf("排序后的数字:\n");
    for (i=0;i<nmbsz;i++)
    {
        printf("%d ",sz[i]);
    }
    return 0;

}