与计数器和文件i / o的交互

时间:2016-10-12 00:52:04

标签: c io overflow

我有一个程序应该计算一个字母出现在文本文件中的次数。

void file_histogram(char *filename)
{
  FILE *file1;
    file1 = fopen(filename, "r");
    int size = 26;
    int charCounters[size];
    char c;
    int i, j;

    if(file1 != NULL) {
        while(fscanf(file1, "%c", &c) == 1) {
            for(i = 0; i < size; ++i) {
                if(c == i + 97) {
                    charCounters[i]++;
                    break;
                }
            }
        }
    }
    for(j = 0; j < size; ++j)
        printf("%c: %d\n", j + 97, charCounters[j]);
    fclose(file1);

这似乎正在做的是计算第一个字符两次,然后大约一半被正确计算,而另一半似乎达到最大值或溢出。到底发生了什么?

1 个答案:

答案 0 :(得分:0)

第一个for()循环的逻辑不正确。提出类似的建议:

#include <ctype.h>
....
// initialize to all 0s
int charCounters[26] = {0};
....
while(fscanf(file1, "%c", &c) == 1) 
{
    if( isalpha(c) )
    {  // then alphabet a...z or A...Z
        // -'a' to get offset from lower case 'a'
        // to use as index into array
        charCounters[ tolower(c)-'a' ]++;
    }
}