介绍
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为字符集的大小。