Я занимаюсь домашней работой курса программирования C, и мне нужно найти наиболее распространенный символ в данном файле.Наиболее распространенный символ в файле в C
Мое тестирование тестовым файлом, пустым файлом и другими текстовыми файлами небольшого объема отлично работает (или, по крайней мере, я так думаю), но в последнем длинном тестовом файле что-то пошло не так, и сообщение об ошибке: «Должен был вернуться» '(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';
}
Я был бы очень признателен, если кто-то есть какие-то намеки, чтобы исправить мой код :) Я пытался найти решение этой проблемы от многого другого связанного с тем, но ничего не похоже на работу.
'для (INT I = 0; г <= 26; ++ я)' ломает границы массива. –
Я бы также не использовал массив 'char', он не будет работать с большими файлами. Используйте 'unsigned int'. –
Кроме того, вы читаете и отбрасываете первый символ в файле. –