2 条题解
-
0
在 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
- 上传者