如何计算字符串中字符的频率

时间:2017-01-15 05:53:58

标签: c arrays frequency

我是C编程的初学者,所以我的代码非常基础。它是计算字符串中字符的频率。该程序确实运行但问题是它显示每个字符的次数与字符串中显示的次数相同。因此,当我输入你好时,我得到“h发生1次,e发生1次,l发生2次,l发生2次,o发生1次”。我如何消除这一点并使l的计数只出现一次?

for(i=0;str[i]!='\0';i++)
{
  for(j=0;str[j]!='\0';j++)
        {
            if(str[i]==str[j])
                    count[i]++;
        }
}
for(i=0;i<str[i]!='\0';i++)
    printf("%c occurs %d times \n",str[i],count[i]);

3 个答案:

答案 0 :(得分:1)

我认为构建自己的功能可以删除重复的字符,这有助于您实现自己想要做的事情。但是,没有标准函数可以帮助您从字符串中删除所有重复项。因此,尝试构造一个函数来从字符串中删除所有重复/重复的字符并返回该字符串。这是你的功能的样子:

char* remove_duplicated(char* str, int size) {
    int frequency[256] = {0};
    char* new_str = malloc(size);
    int new_size = 0;

    for(int i=0; str[i]!='\0'; i++)
    {
        if(frequency[(unsigned char) str[i]] == 0) {
            frequency[(unsigned char) str[i]]++;
            new_str[new_size] = str[i];
            new_size++;
        }
    }

    new_str[new_size] = '\0';

    return new_str;
}

构建上述函数后,发送要测量字符频率的字符串并存储返回的字符串。像这样:

char* new_str = remove_duplicated(str, size);

现在在您使用的双for循环中,使用new_str作为外部for循环,并将其用于显示for的{​​{1}}循环

count
不要忘记在remove_duplicated函数中释放malloced数组:

for(i=0; new_str[i]!='\0'; i++)
{
    for(j=0; str[j]!='\0'; j++)
    {
        if(new_str[i] == str[j])
            count[i]++;
    }
 }
 for(i=0; new_str[i]!='\0'; i++)
     printf("%c occurs %d times \n", new_str[i], count[i]);

这是一个在线演示:https://ideone.com/KnkwGX

答案 1 :(得分:0)

您可以使用类似

的内容
int characters[128] = {0};
char string[] = "Hello, World!";
for(int i = 0; string[i] != '\0'; i++) 
    characters[(int)string[i]]++;

for(int i = 0; i < 128; i++) 
    if(characters[i] != 0) 
        printf("%c occurs %d times\n", (char)i, characters[i]);

答案 2 :(得分:0)

使用您编码的方式唯一地打印每个字母的计数会有点困难。请尝试以下方式:

int frequency[122] = {0}; //ascii value of z is 122.
for(i=0;str[i]!='\0';i++)
{
    frequency[str[i]]++;
}
for(i=0;i<=122;i++) {
    if(frequency[i] != 0)
        printf("%c occurs %d times\n", str[i], count[i]);
}