将原字符数组分类统计后填入到新字符数组中:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    scanf("%d\n", &n);
    char* str = malloc(sizeof(char) * n);
    int countLow = 0, countNum = 0;
    for (int i = 0; i < n; ++i) {
        str[i] = getchar();
        if (str[i] >= 'a' && str[i] <= 'z') {
            ++countLow;
        } else if (str[i] >= '0' && str[i] <= '9') {
            ++countNum;
        }
    }
    char* sortedStr = malloc(sizeof(char) * (n + 1));
    int li = 0, ni = countLow, ui = countLow + countNum;
    for (int i = 0; i < n; ++i) {
        if (str[i] >= 'a' && str[i] <= 'z') {
            sortedStr[li++] = str[i];
        } else if (str[i] >= '0' && str[i] <= '9') {
            sortedStr[ni++] = str[i];
        } else {
            sortedStr[ui++] = str[i];
        }
    }
    sortedStr[n] = '\0';
    free(str);
    puts(sortedStr);
    free(sortedStr);
    return 0;
}