C语言—统计一串字符中各个字符的出现频率

简介: 本文就如何统计一串字符串中全部字符出现的次数为例简单介绍了实现思路并给出了程序设计。


🎀 文章作者:二土电子
🐸 期待大家一起学习交流!


1 目标效果

编写程序,能够统计某一段字符串中各个字符出现的次数。比如输入一串“abcade”,能够统计出其中各个字母的出现频率。

2 程序实现

2.1 程序代码

#include<stdio.h>
#include<string.h>

void main()
{
   
   
    char str[20];   // 输入的字符串
    int i,num[256]={
   
   0};   // 统计次数时的变量
    printf("please input string:\n");
    scanf("%s",str);
    // 统计次数
    for(i=0;i<strlen(str);i++)
        num[(int)str[i]]++;
    // 显示结果
    for(i=0;i<256;i++)
        if(num[i]!=0)
            printf("字符%c出现%d次\n",(char)i,num[i]);
}

2.2 实现思路

这里实现思路比较巧妙,变量i用来做for循环的变量。num[]这个数组是给每一个ASIIC字符开辟的数组,通过(int)str[i]在遍历整个输入字符串str[]的同时,给每一个ASIIC码都确定了一个计次变量的存储位置。num[]++是ASIIC码对应字符出现次数自加操作。for循环的过程中num[(int)str[i]]用来记录每一个出现过的字符的次数,当统计完成后开始准备输出结果。

显示统计结果是也比较巧妙,经过第一个统计次数的for循环后,每一个出现过的字符的num[]对应位置的值都不为0,而且其索引,也就是第二个for循环中的i,恰好是其统计的字符对应的ASIIC码的值。因此在输出时(char)i是出现过的字符串,num[i]对应其出现过的次数。

为了方便理解,加上一些输出中间过程值的printf语句来观察整个程序运行的逻辑。修改后的代码如下

#include<stdio.h>
#include<string.h>

void main()
{
   
   
    char str[20];   // 输入的字符串
    int i,num[256]={
   
   0};   // 统计次数时的变量
    printf("please input string:\n");
    scanf("%s",str);

    // 统计各个字符出现的次数
    for(i=0;i<strlen(str);i++)
    {
   
   
        num[(int)str[i]]++;
        printf("i=%d\n",i);
        printf("str[i]=%d\n",str[i]);
        printf("num[(int)str[i]]=%d\n",num[(int)str[i]]);
    }

    for(i=0;i<256;i++)
    {
   
   
        if(num[i]!=0)
        {
   
   
            printf("字符%c出现%d次\n",(char)i,num[i]);
        }
    }
}

输入asdfasdfghjkjuhgfdsa后观察输出结果,如下

i=0   // 开始遍历输入字符串str中的第一个字符
str[i]=97   // 字母a对应的ASIIC码值
num[(int)str[i]]=1   // num中索引为97的位置加了1

i=1   // 开始遍历输入字符串str中的第一个字符
str[i]=115   // 字母s对应的ASIIC码值
num[(int)str[i]]=1   // num中索引为115的位置加了1

i=2
str[i]=100
num[(int)str[i]]=1

i=3
str[i]=102
num[(int)str[i]]=1

i=4
str[i]=97
num[(int)str[i]]=2

i=5
str[i]=115
num[(int)str[i]]=2

i=6
str[i]=100
num[(int)str[i]]=2

i=7
str[i]=102
num[(int)str[i]]=2

i=8
str[i]=103
num[(int)str[i]]=1

i=9
str[i]=104
num[(int)str[i]]=1

i=10
str[i]=106
num[(int)str[i]]=1

i=11
str[i]=107
num[(int)str[i]]=1

i=12
str[i]=106
num[(int)str[i]]=2

i=13
str[i]=117
num[(int)str[i]]=1

i=14
str[i]=104
num[(int)str[i]]=2

i=15
str[i]=103
num[(int)str[i]]=2

i=16
str[i]=102
num[(int)str[i]]=3

i=17
str[i]=100
num[(int)str[i]]=3

i=18
str[i]=115
num[(int)str[i]]=3

i=19
str[i]=97
num[(int)str[i]]=3

// 最终统计结果
字符a出现3次
字符d出现3次
字符f出现3次
字符g出现2次
字符h出现2次
字符j出现2次
字符k出现1次
字符s出现3次
字符u出现1

经过测试,该程序统计长度为20的字符串中每个字符出现的频率耗费的大概是4ms
ecd739dd7378def85470978ba3187192_89525e36c1b64660b74217fd8498e007.png

相关文章
|
2月前
|
C语言
C语言字符(串)函数
C语言字符(串)函数
|
2月前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
3月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
2月前
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
4月前
|
编译器 C语言
【C语言小知识】ctype.h系列的字符函数
【C语言小知识】ctype.h系列的字符函数
|
4月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
64 0
|
4月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
56 0
|
5月前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
72 0
【C语言】字符函数,字符串函数,内存函数
|
5月前
|
C语言
C语言5 字符输出函数和格式输出函数
C语言5 字符输出函数和格式输出函数
99 1