这是我的程序。我正在尝试找到字符串每个字符的频率并显示它。在回答时,请注意我不想尝试 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;
}
所以你希望找到字符串中字符的频率。
关于代码中的错误:
- 考虑字符串
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("%dn",frequencyChar[i]);
}
P.S.上面的代码只假设字符串中的小写字符。微小的更改将允许包含大写字母!
以下是问题:
- 您已经编写了:
I am trying to find the frequency of each character
,但您的代码正在尝试计算字符对之间的相关性直方图。 - 作为
count
的索引,您使用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 - %dn", (char)i, histogram[i]);
}
}
}
生成字符相关矩阵:
void correlationMatrixForStr(char *str, int matrix[256][256])
{
memset(matrix, 0, sizeof(matrix));
int len = strlen(str);
for (int i=0; i<len; ++i) {
for (int j=i+1; j<len; ++j) {
matrix[i][j]++;
}
}
}