C语言,统计输入正文中每个数字字符,英文字符和其他字符出现的次数,以EOF结束

C语言,统计输入正文中每个数字字符,英文字符和其他字符出现的次数,以EOF结束

用while循环输入,判断是否为EOF,对每个字符进行ASCII码范围判断

#include <stdio.h>
int main()
{
    char ch;
    int nums=0,chars=0,others=0;
    while(scanf("%c",&ch) != EOF)
    {
        if(ch>='0' && ch<='9')
            nums++;
        else if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
            chars++;
        else
            others++;
    }
    printf("字母%d个,数字%d个,其它%d个",chars,nums,others);
    return 0;
}

EOF是个宏,其值为-1,所以统计要以EOF结束,即出现-1时结束统计,参考代码如下:

int main(int argc, const char * argv[]) {
    char ch[100];
    scanf("%s", ch);
    int nums = 0, chars = 0, others = 0, i = 0;
    int flag = 0; // 标记是否出现负号
    while (ch[i] != '\0') {
        
        printf("%d: %c\n", i + 1, ch[i]);
        if (ch[i] >= '0' && ch[i] <= '9') {
            // 出现EOF即-1的情况,退出循环,others计数-1(减掉'-'if (ch[i] == '1' && flag == 1) {
                
                others--;
                break;
            }
            // 不是'1'的时候重置该标记
            flag = 0;
            nums++;
        } else if ((ch[i] >= 'A' && ch[i] <= 'Z') || (ch[i] >= 'a' && ch[i] <= 'z')) {
            
            // 不是'-'的时候重置该标记
            flag = 0;
            chars++;
        } else {
            
            if (ch[i] == '-') {
                // 出现负号
                flag = 1;
            } else {
                // 不是'-'的时候重置该标记
                flag = 0;
            }
            others++;
        }
        i++;
    }
    printf("数字:%d 个, 字母:%d 个, 其他:%d 个\n", nums, chars, others);
    
    return 0;
}