#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.我做错了什么?
答案 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
。等等。