Problem Description
给出一串字符,要求统计出里面的字母、数字、空格以及其他字符的个数。
字母:A, B, ..., Z、a, b, ..., z组成
数字:0, 1, ..., 9
空格:" "(不包括引号)
剩下的可打印字符全为其他字符。
字母:A, B, ..., Z、a, b, ..., z组成
数字:0, 1, ..., 9
空格:" "(不包括引号)
剩下的可打印字符全为其他字符。
Input
测试数据有多组。
每组数据为一行(长度不超过100000)。
数据至文件结束(EOF)为止。
每组数据为一行(长度不超过100000)。
数据至文件结束(EOF)为止。
Output
每组输入对应一行输出。
包括四个整数a b c d,分别代表字母、数字、空格和其他字符的个数。
包括四个整数a b c d,分别代表字母、数字、空格和其他字符的个数。
Example Input
A0 ,
Example Output
1 1 1 1
代码:#include <stdio.h> #include <string.h> int main() { char st[100000]; while(gets(st) !=NULL)/*巨巨告诉我说,让文件结束,要根据函数返回值来写后面的东西。而不都是EOF.标准函数都有返回值,所以,要想学的细,都应该了解一下*/ { /*这里!=NULL不写也行,gets没有输入的时候就是返回NULL判断遇到NULL是判定为false的 */ int a = 0, b = 0 ,c = 0, d = 0; int e,i; e = strlen(st); for(i=0;i<=e-1;i++) { if((st[i] >= 'A'&&st[i]<='Z')||(st[i]>='a'&&st[i]<='z')) a++; else if(st[i]>='0'&&st[i]<='9') b++; else if(st[i]==' ') c++; else d++; } printf("%d %d %d %d\n",a,b,c,d); memset( st, 0, sizeof(st) ); } return 0; }
扩展的知识:
1;清空数据的方法:
char a[80];
(1)memset() 给指定内存置相应的值
#include <string.h> //引用相关头文件
memset( a, 0, sizeof(a) ); //把从a开始的80个字符全置为0
(2)循环遍历数组,逐位清0
for( int i=0;i<sizeof(a);i++ )
a[i]=0; //该循环达到memset()函数的效果。
(3,)所谓的字符串清空:
strcpy(a, ""); 本句相当于 a[0]=0 ;
这里只是完成了数组a的首地址置0,0是字符串结束符'\0'的ascii值,这样赋值后,只是表示一个空字符串,而剩余的数组位置上的数据还是原来存储的内容不会有变化的。所有的字符串操作函数,都会遇0而止的,所以,用户看不到后面位置上的垃圾数据
2:strlen()与sizeof()的区别
(1)strlen()测得是实际长度。而sizeof测得是数组的最大长度;
例:char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
(2)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。上一个知识点中总结的清空数组的方法,sizeof()就是整个数组的长度,然后全部清空。
sizeof还可以用函数做参数,比如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。
3;判断文件结束的标志要根据函数返回值来看。 gets返回值是NULL,是个地址,而scanf的返回值是函数的输入个数,是个整数。标准函数都有返回值。
班里的一个巨巨给我讲的。其实还不是很懂。有空多了解一下函数的返回值。还有这些小问题好杂啊,一点点来加油。