尝试在数组中输出多个最常见的字母

Trying to output multiple most frequent letters in an array

我正在尝试从一串文本中获取一些统计信息,例如单词和句子的数量等。在这些统计信息中,有字符串中使用频率最高的字母。我目前正在使用下面的这些函数来获取所需的大部分统计信息。

typedef struct statistics
{
    char_counts_t char_info;
    int sentences;
    int words;
    int freq[26];
    int max_freq;
    char most_freq_chars[27];
} statistics_t;

void get_letter_frequencies(const char *text, size_t len, int freq[26], int *max_freq)
{
    for (int i = 0; i < 26; i++)
        freq[i] = 0;

    for (int i = 0; i < len; i++)
    {
        if ((text[i] >= 97) && (text[i] <= 122))
            freq[text[i] - 97]++;
    }

    *max_freq = 0;
    for (int i = 0; i < 26; i++)
    {
        if (*max_freq < freq[i])
        {
            *max_freq = freq[i];
        }
    }
}


void get_text_statistics(const char *text, size_t len, statistics_t *data)
{

    data->words = count_words(text, len);
    data->sentences = count_sentences(text, len);

    get_char_counts(text, len, &data->char_info);
    get_letter_frequencies(text, len, data->freq, &data->max_freq);


    for (int q = 0; q < 26; q++)
        data->most_freq_chars[q] = 0;

    for (int q = 0; q < 26; q++)
    {
        int max = 0;
        if (data->max_freq == data->freq[q])
        {
            data->most_freq_chars[max] = (char) (q + 97);
            max++;
        }
    }
}

现在,在尝试将统计数据制成表格时,我使用了一个 while 循环,以防出现两个或更多个具有相同频率的字母。

printf("| Most frequent letter(s)        |  [%c]  |\n", data.most_freq_chars[0]);

int a = 1;
while (data.most_freq_chars[a] != '[=11=]')
{
printf("|                                |  [%c]   |\n", data.most_freq_chars[a]);
a++;
}

为了尝试这个场景,我输入了字符串“Hello. Goodluck!”期望得到两个最常见的字母([o] 和 [l]),然而,只有其中一个出现([o])。

我该怎么做?

提前致谢

识别max_freq的代码应该在计算不同字母频率的循环之外,因为我们只有在知道所有频率后才能计算最大频率。

所以get_letter_frequencies函数应该这样写-

void get_letter_frequencies(const char *text, size_t len, int freq[26], int *max_freq)
{
    for (int i = 0; i < 26; i++)
        freq[i] = 0;

    for (int i = 0; i < len; i++)
    {
        if ((text[i] >= 97) && (text[i] <= 122))
            freq[text[i] - 97]++;
    }
    *max_freq = 0;
    for (int i = 0; i < 26; i++)
        if (*max_freq < freq[i])
            *max_freq = freq[i];
}