字符统计

Problem Description
给出一串字符,要求统计出里面的字母、数字、空格以及其他字符的个数。
字母:A, B, ..., Z、a, b, ..., z组成
数字:0, 1, ..., 9 
空格:" "(不包括引号) 
剩下的可打印字符全为其他字符。
Input
测试数据有多组。
每组数据为一行(长度不超过100000)。
数据至文件结束(EOF)为止。
Output
每组输入对应一行输出。
包括四个整数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还可以用函数做参数,比如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。
上一个知识点中总结的清空数组的方法,sizeof()就是整个数组的长度,然后全部清空。
3;判断文件结束的标志要根据函数返回值来看。 gets返回值是NULL,是个地址,而scanf的返回值是函数的输入个数,是个整数。标准函数都有返回值。
班里的一个巨巨给我讲的。其实还不是很懂。有空多了解一下函数的返回值。还有这些小问题好杂啊,一点点来加油。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值