每日一题|如何统计某字符中各小写字符的数量?

文章详细介绍了如何使用C语言动态分配内存,通过`malloc`和`fgets`处理输入字符串,并利用ASCII码计算字符出现次数。还提及了大写字符计数的方法。
摘要由CSDN通过智能技术生成

先放代码,然后详解:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main(void)
{
    char *str = NULL;
    int size = 100;
    str = (char*)malloc(size*sizeof(char*));
    fgets(str,size,stdin);
    int cnt[26] = {0};
    for (int i = 0;i < strlen(str);i ++)
    {
        cnt[str[i] - 'a'] ++;
    }
    for (int i = 0;i < 26;i ++)
    {
        if (cnt[i] != 0)
        {
            printf("%c:%d\n",'a' + i,cnt[i]);
        }
    }
    free(str);
    return 0;
}

接下来我们分段讲述.

 

  • 输入字符串?

如图所示,输入的字符串以指针数组形式存在,我们使用了malloc函数来对它进行动态分配内存.

char *str = NULL;//先对该指针进行初始化;
    int size = 100;
    str = (char*)malloc(size*sizeof(char*));//使用malloc函数进行动态分配内存;
    fgets(str,size,stdin);//这里使用fgets函数,使数据的输入更加安全,能够防止数据溢出。

其中的fgets函数比gets函数更加安全,str指被输入的字符串,size指能输入进去的大小,stdin表示标准输入.

当然对于某些情况来说,这是脱裤子放屁的写法,笔者写这个纯纯是为了练习malloc函数(什么)。在OJ里,我们可以这么写:

char str[100];
scanf("%99s",str);//为什么要加个%99?这意味着防止缓冲区溢出。程序只允许输入99个字符。
//最后别忘了清除缓冲区。这是一个好习惯。
int c;
while ((c = getchar() != '\n') && c != '\n');

但是读者们可以试着运行一下,其运行时间和效率显然是比图上所述要长的.

  • 如何计数?

这里计数的核心原理是:ASCII码.

int cnt[26] = {0};
    for (int i = 0;i < strlen(str);i ++)
    {
        cnt[str[i] - 'a'] ++;
    }

定义一个有26个下标的数组;将char型的字符转换为可以计数的int型;用相减的方法计算出该字符与'a'的距离,并将其存放到相应的数组下标内。

如下图对照表,例如'a'与'a'之间的距离是0,则存放到cnt[0]内;'d'与'a'之间的距离是3,因此存放到cnt[3]内。这样数组下标的0~25可分别表示为从'a'~'z',通过遍历str,有几个相应的字符,就在相应字符的内存中加1.

ASCII 编码一览表
二进制十进制十六进制字符/缩写解释
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
  • 最后遍历输出 
for (int i = 0;i < 26;i ++)
    {
        if (cnt[i] != 0)
        {
            printf("%c:%d\n",'a' + i,cnt[i]);
        }
    }

if的意思为,如果某下标中的数据存放的不是0,那么该下标对应的字符绝对出现过,便将其打印出来.

  • 如果也统计大写?

至此,原理已经搞懂,大写怎么计数也不是一件难事。只需找到大写相应的ACSII码值(对对对,就是比小写字母小32位的那个),在计数时加一个判断条件

//计数小写be like:
if (str[i] >= 'a' &&str[i] <= 'z')
//计数大写be like:
if (str[i] >= 'A' &&str[i] <= 'Z')

即可.

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值