编写一个程序来计算文件中的字符数

时间:2016-12-02 21:44:41

标签: c

#include <stdio.h>
#include <varargs.h>
#include <ctype.h>

....................

        c = toupper(c);

        if (c == 'A')
            alphabet[0]++;


    printf("Letter Frequency\n\n");
    for (i = 0; i < 26; i++)
    {
        printf("%c %d\n", (char)(i+'A'), alphabet[i]);
    }
}

我遇到的问题是,计算所有不同的字母并将其转移到文件的输出中。

当我评论这一行:c = toupper(c);它似乎运作良好,但仅限A。我宁愿有办法自动完成所有字母而不是输入A到Z.我做错了什么?

2 个答案:

答案 0 :(得分:0)

仔细观察你的循环。 while后面没有大括号,因此正文只包含行c = toupper(c);。您还需要添加大括号以将if块添加到循环中。

要更新数组,请从'A'中减去相关字符。当你打印时,你正在做相反的事情,所以我很惊讶你没有想到这一点。这将为您提供数组中的索引。

while ((c= getc(fptr)) != EOF) {
    c = toupper(c);
    if (c >= 'A' && c <= 'Z') {
        alphabet[c - 'A']++;
    }
}

答案 1 :(得分:0)

假设您要将'A'映射到数字0,将'B'映射到数字1,依此类推。显而易见的方法是手动创建映射。

但是你可以避免手工操作。假设字符'A''Z'在您的实现中是连续的并且按升序排列(通常是它们),有一个表达式将统一处理上述映射。对于变量字符c,该表达式为c-'A'

if('A' <= c && c <= 'Z') {
    alphabet[c-'A']++;
}

亲自试试吧。如果c'A',则c-'A''A'-'A',显然为0,因为您正在从自身中减去某些内容。如果c'B'(或'A' + 1),则c-'A''B'-'A',即'A'+1-'A',即1。等等。