开发者

How to create a function to count occurrences of each letter?

In C, I need to create a function that, for an input, will count and display the number of times each letter occurs.

For input of "Lorem ipsum dolor 开发者_StackOverflow中文版sit amet", the function should return something similar to:

a: 0
b: 0
c: 0
d: 1
e: 2
f: 0
...


So you will basically need to read through the entire file char-by-char. Assuming that you know how file-reading works, you will need to do something like (apologies, been a while since I did C):

if (isalpha(ch)) {
  count[ch-'a']++;
}
/* rest of code where char pointer is moved on etc. */

You will need to import the ctype library for that:

#include <ctype.h>

** forgot to mention, assumed you would deduce the following: ch is your pointer to the currently read in character, while count[] is an int[], initialized to all zeros with a size of (26 * 2) = 52 to cater for both upper and lowercase. If upper and lower-case should be treated the same, you can use the tolower(int c) function also included in the ctype library. In this case you only need a 26 size array.

if (isalpha(ch)) {
  count[tolower(ch)-'a']++;
}

Then the count[] should contain the counts for each character.

/* ***** */

If you wanted to do this with only the stdio.h library, you can implement the two functions used from the ctype.h library.

A simple implementation of the isalpha(int c) function could be something like:

if (((int)c >= 'a' && (int)c <= 'z') || ((int)c >= 'A' && (int)c <= 'Z') {
  return TRUE;
} else {
  return FALSE;
}

(where TRUE and FALSE are of type your return type and something you defined).

And a REALLY simple version of tolower could be something like:

if ((int)c >= 'A' && (int)c <= 'Z') {
  return (int)c - 'a';
} else {
  return (int)c;
}

You could probably do without all the casts...


hints:

char c[26] = { 0 }; // init
// read each input chars
    ++c[input-'a'];


I would have an array (of the size equal to char domain) and increment the count at apropriate position.

 count[ch]++;


Just in case you are concerned with speed:

unsigned int chars[255], *p = text;

while(*p) chars[*p]++;

for(int i = 0; i < 255; i++) if(i > ('A' - 1) && i < ('Z' + 1)) printf("%c) %u/n", i, chars[i];

Sorry for the "/n" but my mac pro does not have the right character on its keyboard...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜