这是我的程序。我正在尝试查找字符串中每个字符的频率并显示它。在回答时请注意我不想尝试ASCII概念,我想知道这个概念有什么不对。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int l=0,j,k,m,count[10000];
char string[10000];
printf("Enter the string : \n");
scanf("%s",string);
l=strlen(string);
printf("%d",l);
for(j=0;j<l;j++)
{
for(k=j+1;k<l;k++)
{
if(string[j]==string[k])
{
count[j]++;
}
}
}
for(m=0;m<l;m++)
{
printf("%d",count[m]);
}
return 0;
}
答案 0 :(得分:1)
以下是问题:
I am trying to find the frequency of each character
,但您的代码正在尝试计算字符对之间相关性的直方图。count
的{{1}}的索引,它在字符串中迭代组成字符。这意味着您的表格j
有很多count
,只有一些0
而没有其他内容。可以像这样创建字符直方图:
1
生成字符关联矩阵:
void makeStrHistogram(char *str, int histogram[256])
{
memset(histogram, 0, sizeof(histogram));
while (*str) histogram[*str++]++;
}
void printHistogram(int histogram[256])
{
for (int i=0; i<256; ++i) {
if (histogram[i]) {
printf("%c - %d\n", (char)i, histogram[i]);
}
}
}
答案 1 :(得分:1)
因此,您希望找到字符串中字符的频率。
关于代码中的错误:
lalal
在这里,您将计算最后l
两次,一次对应于第一个l
,第二次对应第三个l
。因此,你的逻辑是错误的。count[]
的情况。您尚未初始化数组,因此它包含垃圾值。因此,解决问题的另一种方法是声明一个26元素的数组(英文字母),遍历整个列表,并在找到该元素时增加与每个元素对应的计数。
int frequencyChar[26] = {0};//stores frequency of characters [a-z], initialized to zero
for( i=0; i<strlen(str); i++) //iterate through the entire string
{
frequencyChar[str[i] - 'a']++; //increment count corresponding to each element
}
for( i=0; i<26; i++)
{
printf("%d\n",frequencyChar[i]);
}
P.S.Above代码假设字符串中只包含小写字符。小的改动将允许包含大写字母!