【发布时间】:2017-02-06 05:07:15
【问题描述】:
我正在做我的 C 编程课程作业,我需要在给定文件中找到一个最常见的字符。
我使用 testfile、emptyfile 和其他少量文本文件的测试效果很好(或者至少我认为如此),但在最后一个长的 testfile 中出现了问题,错误消息是:“应该返回 ' e' (101) 用于文件 rfc791.txt。您返回了 'b' (98)"。
所以我要问的是我的代码可能有什么问题,突然间最常见的字母不是应该的?
int most_common_character(char *filename) {
FILE *f;
if ((f = fopen(filename, "r")) == NULL) {
fprintf(stderr, "Not opened: %s\n", strerror(errno));
return -1;
}
char frequency[26];
int ch = fgetc(f);
if (ch == EOF) {
return 0;
}
for (ch = 0; ch < 26; ch++) {
frequency[ch] = 0;
}
while (1) {
ch = fgetc(f);
if (ch == EOF) {
break;
}
if ('a' <= ch && ch <= 'z') {
frequency[ch - 'a']++;
}
else if ('A' <= ch && ch <= 'Z') {
frequency[ch - 'A']++;
}
}
int maxCount = 0;
int maxChar = 0;
for (int i = 0; i <= 26; ++i) {
if (frequency[i] > maxCount) {
maxCount = frequency[i];
maxChar = i;
}
}
fclose(f);
return maxChar + 'a';
}
如果有人有任何提示来修复我的代码,我将不胜感激:) 我已尝试从许多其他相关主题中搜索此问题的解决方案,但似乎没有任何效果。
【问题讨论】:
-
for (int i = 0; i <= 26; ++i)打破了数组边界。 -
我也不会使用
char数组,它不适用于较大的文件。使用unsigned int。 -
此外,您正在读取并丢弃文件中的第一个字符。
-
好吧,@WeatherVane 给了你答案。
char范围不足以容纳您的测试文件。 -
int ch = fgetc(f);删除一个字符。