2 条题解

  • 0
    @ 2025-10-11 0:17:53

    152520221 刘正潇 同学题解的基础之上进行一些补充:

    1.有关读取:

    部分同学可能会使用wscanf(const wchar_t *format, ...) (scanf的变形,适用于宽字符),这种方式会导致部分测试点无法通过,因为测试数据可能包含空格,wscanf在读取字符串时以空格为结束标志,含有空格的字符串将无法完全读入。

    2.关于for循环:

    152520221 刘正潇 同学使用wcslen()函数读取字符串长度实现循环退出,除此方法以外,判断当前元素是否为'\0'(字符串结尾标识,此处也解释了为什么要定义大于样本数据的数组)实现循环的退出也是可行的,因为在接下来的判断中我们会排除'\n',对计数无影响

    for (int a=0;i[a]!='\0';a++)
    

    3.关于判断类型:

    部分同学可能想使用isdigit()和isalpha()判断数字和字母,此方法不可行,其无法正确判断宽字符(详情自行查阅编码表和函数判断原理),应类比汉字的判断使用区间判定

    参考代码

    注意,本代码仅作参考,强烈不建议复制屎山!!

    #include<stdio.h>
    #include<wchar.h>
    #include<locale.h>
    int main()
    {
        setlocale(LC_ALL,"C.UTF-8");
        int chinese=0,english=0,digit=0,other=0;
        wchar_t i[1001];
        fgetws(i,1001,stdin);
        for (int a=0;i[a]!='\0';a++) {
            if (i[a]>=L'a'&&i[a]<=L'z'||i[a]>=L'A'&&i[a]<=L'Z')
            {
              english++;
            }
            else if (i[a]<=L'9'&&i[a]>=L'0')
            {
              digit++;
            }
            else if (i[a]>=L'一'&&i[a]<=L'鿿')
            {
              chinese++;}
            else if (i[a]!=L'\n')
            {
              other++;
            }
        }
        printf("%d\n%d\n%d\n%d\n",chinese,english,digit,other);
        return 0;
    }
    

    信息

    ID
    103
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    1747
    已通过
    132
    上传者