思路:
题目总共涉及三种类型的字符:大写字母,小写字母,数字
我们可以简单归纳为两类:字母类和数字类(采用isalpha和isdigit来判断),创建两个数组来保存这两类字符
因为题目要求按照ASCII码值从小到大排列,与此对应从小到大排序的算法中刚好有冒泡排序,于是我们可以定义一个冒泡排序的函数
因为数字的ASCII码值比字母的要小,所以数字在字母的前面,我们就可以直接将排好序的字母数组拼接在排好序的数字数组
最后将拼接完的数组拷贝回原来的数组,全部打印出来即可
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
#include<ctype.h>
void maopao(char* ch) //冒泡排序函数
{
int len = strlen(ch);
int i = 0, j = 0;
for (i = 0; i < len - 1; i++)
{
int flag = 1;
for (j = 1; j < len - i; j++)
{
if (ch[j - 1] > ch[j])
{
char tmp = ch[j - 1];
ch[j - 1] = ch[j];
ch[j] = tmp;
flag = 0;
}
}
if (flag)
{
break;
}
}
}
int main()
{
char ch[1000] = { 0 }; //原数组
char a[1000] = { 0 }; //字母数组
char b[1000] = { 0 }; //数字数组
int i = 0, j = 0, k = 0;
while ((ch[i] = getchar()) != '\n')
{
if (isalpha(ch[i])) //如果是字母
{
a[j] = ch[i];
j++;
}
if (isdigit(ch[i])) //如果是数字
{
b[k] = ch[i];
k++;
}
i++;
}
a[j] = '\0'; //给字符串加上\0
b[k] = '\0'; //给字符串加上\0
maopao(a);
maopao(b);
strcat(b, a); //将字母数组拼接在数字数组后面
strcpy(ch, b); //再将整理好的数组拷贝给原数组
for (int n = 0; n < i; n++) //打印出来
{
printf("%c", ch[n]);
}
printf("\n");
return 0;
}