Search code examples
ccharacterfrequency

How do it get character frequency and highest character frequency?


so this is my function. My main focus is to get the character frequencies and the highest character frequency.

The function below (get_letter_frequencies) is supposed to get a string example ("I am a big boy") and return the character frequencies and the highest character frequency.

The Function should return
i - 2
a - 2
m - 1
b - 2
g - 1
o - 1
y - 1
Highest character frequency would be " iab "

My problem is with the get_letter_frequencies function. What should I arrange from the function in order to return the above output?

void get_letter_frequencies(const char *text, size_t len, int freq[26], int *max_freq)
{

for(int i = 0; i<len; i++)
    {
        if(text[i] != ' ' || !(is_sentence_terminator(text[i]))) //this condition is set in order to ignore the spaces and the sentence terminators (! ? .) 
        {
            if(text[i] >= 'a' && text[i] <= 'z')
            {
                freq[text[i] - 'a']++;
            }
        }
    }

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

This function below(is_sentence_terminator). Here the function checks whether the sentence finishes with a " ! ? or . " if it does not finish with one of the terminators then it is not a sentence and ignores it.

int is_sentence_terminator(char ch)
{

        if(ch == 33 || ch == 46 || ch == 63)
        {
            return 1;
        }else
        {
            return 0;
        }

}


Solution

  • There are some issues in your code:

    • there is no need to test for special characters, comparing text[i] to 'a' and 'z' is sufficient for ASCII systems.

    • in the second loop, you should update *max_freq only if freq[j] is greater than the current value, not 1. *max_freq should be initialized to 0 before the loop.

    In the calling code, you would also

    • print the letters whose frequency is non 0.
    • print all letters with the maximum frequency using one final loop.

    Here is a modified version:

    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] >= 'a' && text[i] <= 'z') {
                freq[text[i] - 'a']++;  // assuming ASCII
            }
        }
    
        *max_freq = 0;
        for (int i = 0; i < 26; i++) {
            if (*max_freq < freq[i]) {
                *max_freq = freq[i];
            }
        }
    }