c语言如何统计字符串中每个字符出现的次数?

介绍

C语言中,字符串是一种用于存储和操作文本数据的数据类型。在实际开发中,我们通常需要对字符串进行操作,比如说统计字符串中每个字符出现的次数。本文将介绍如何使用C语言编写代码实现此操作。

方法一:数组法

1. 思路

我们可以使用一个长度为256的数组来记录每个字符的出现次数,因为ASCII码的可见字符只有256个。首先,将数组的值全部赋为0,然后遍历字符串中的每一个字符,将该字符对应的数组元素加1。 最后,遍历数组,输出每个字符和对应的出现次数。

2. 代码实现

#include <stdio.h>

#include <string.h>

int main()

{

char str[100];

int i, len;

int freq[256];

printf("输入字符串:");

scanf("%s", str);

len = strlen(str);

for(i=0;i<256;i++)

{

freq[i]=0;

}

for(i=0;i<len;i++)

{

freq[str[i]]++;

}

for(i=0;i<256;i++)

{

if(freq[i]!=0)

{

printf("%c出现了%d次\n", i, freq[i]);

}

}

return 0;

}

3. 示例运行

以下是一个示例:

输入字符串:hello world!

h出现了1次

e出现了1次

l出现了3次

o出现了2次

w出现了1次

r出现了1次

d出现了1次

!出现了1次

方法二:hash表法

1. 思路

我们可以使用一个哈希表来实现统计字符出现次数的功能。哈希表是一种数据结构,利用哈希函数将要存储的元素映射到一个哈希表中的位置。这种方法的优势在于,查找和插入的时间复杂度均为O(1)。

2. 代码实现

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct hash_node

{

char key;

int val;

struct hash_node* next;

}hash_node;

hash_node* new_node(char key, int val)

{

hash_node* node = (hash_node*)malloc(sizeof(hash_node));

node->key = key;

node->val = val;

node->next = NULL;

return node;

}

void insert(hash_node** table, char key)

{

int hash_value = (int)key % 256;

if(table[hash_value] == NULL)

{

table[hash_value] = new_node(key, 1);

}

else

{

hash_node* temp = table[hash_value];

while(temp)

{

if(temp->key == key)

{

temp->val++;

return;

}

temp = temp->next;

}

hash_node* node = new_node(key, 1);

node->next = table[hash_value];

table[hash_value] = node;

}

}

void print_frequency(hash_node** table)

{

int i;

for(i=0;i<256;i++)

{

if(table[i]!=NULL)

{

printf("%c出现了%d次\n",table[i]->key, table[i]->val);

}

}

}

void free_table(hash_node** table)

{

int i;

for(i=0;i<256;i++)

{

if(table[i]!=NULL)

{

hash_node* temp1 = table[i];

hash_node* temp2 = table[i];

while(temp1)

{

temp2 = temp1->next;

free(temp1);

temp1 = temp2;

}

}

}

}

int main(int argc, char** argv)

{

if(argc!=2)

{

printf("Usage: %s string\n",argv[0]);

return 1;

}

int len = strlen(argv[1]);

char* str = argv[1];

hash_node** table = (hash_node**)calloc(256, sizeof(hash_node*));

int i;

for(i=0;i<len;i++)

{

insert(table, str[i]);

}

print_frequency(table);

free_table(table);

return 0;

}

3. 示例运行

以下是一个示例:

$ ./hash_frequency hello world!

h出现了1次

e出现了1次

l出现了3次

o出现了2次

w出现了1次

r出现了1次

d出现了1次

!

总结

本文介绍了两种C语言统计字符串中每个字符出现次数的方法:数组法和哈希表法。数组法适用于字符集较小的场景,时间复杂度为O(n),空间复杂度为O(1);哈希表法适用于字符集较大的场景,时间复杂度为O(n),空间复杂度为O(k),其中k为字符集的大小。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签