解题思路:
本题与题库中其他 字符串问题 较为类似,
重点在于 一直维护map[4] 的数组, 其中的 0 1 2 3 分别代表 字母, 空格, 数字,其他字符即可;

小tips: 
快速判断 是否为 字母、数字,islower isupper isdigit ,如果相应返回值非0则符合要求

#include <stdio.h>
#include <ctype.h>

int main(void) {
    char str[1001] = {0};
    
    while (fgets(str, 1001, stdin)) {
        int length = strlen(str) - 1;
        int map[4] = {0};
        for (int i = 0; i < length; i++) {
            if ((islower(str[i]) != 0) || (isupper(str[i]) != 0)) {
                map[0]++;
            } else if (str[i] == ' ') {
                map[1]++;
            } else if (isdigit(str[i]) != 0) {
                map[2]++;
            } else {
                map[3]++;
            }
        }
        for (int j = 0; j < 4; j++) {
            printf("%d\n", map[j]);
        }
    }
    return 0;
}