Кажется, что в используемом вами прототипе функции есть хотя бы один лишний параметр. (у вас есть общее количество символов в main()
). Чтобы найти наиболее часто встречающийся символ (по крайней мере, 1-й из символов, встречающихся столько раз), все, что вам нужно для предоставления вашей функции, это:
- строка символов, которая должна быть оценена;
- размер массива, чтобы каждый элемент представлял в диапазоне значений, который вы хотите найти наиболее часто (для символов ASCII 128 - это хорошо, для всех в диапазоне
unsigned char
, 256
подойдет);и, наконец, - указатель для возврата индекса в вашем частотном массиве, который содержит индекс для наиболее часто используемого символа (или 1-го символа набора, если более одного используется такое же количество раз).
В вашей функции ваша цель состоит в том, чтобы зацикливаться на каждом символе в вашей строке. В массиве частот (который вы инициализировали всеми нулями) вы будете отображать каждый символ на элемент в массиве частот и увеличивать значение этого элемента каждый раз, когда встречается символ. Например, для "hello"
вы должны увеличить:
frequency['h']++;
frequency['e']++;
frequency['l']++;
frequency['l']++;
frequency['o']++;
Выше, когда вы закончите, элемент frequency['l'];
будет содержать значение 2
. Итак, когда вы закончите, вы просто зациклите все элементы по частоте и найдете index для элемента, который содержит наибольшее значение.
if (frequency[i] > frequency[most])
most = i;
(именно поэтому вы получите первый из всех символов, которые появляются такое количество раз. Если вы измените на >=
, вы получите последний из этого набора символов. Также, впри подсчете количества символов вы игнорируете шестой символ, '\n'
, что хорошо для однострочного ввода, но для многострочного ввода вам нужно подумать, как вы хотите это обработать)
В вашем случае,говоря в целом, вы можете сделать что-то похожее на:
#include <stdio.h>
#include <ctype.h>
enum { CHARS = 255, MAXC = 1024 }; /* constants used below */
void mostfrequent (const char *s, int *c, int *most)
{
for (; *s; s++) /* loop over each char, fill c, set most index */
if (isalpha (*s) && ++c[(int)*s] > c[*most])
*most = *s;
}
int main (void) {
char buf[MAXC];
int c[CHARS] = {0}, n = 0, ndx;
/* read all chars into buf up to MAXC-1 chars */
while (n < MAXC-1 && (buf[n] = getchar()) != '\n' && buf[n] != EOF)
n++;
buf[n] = 0; /* nul-terminate buf */
mostfrequent (buf, c, &ndx); /* fill c with most freq, set index */
printf ("most frequent char: %c (occurs %d times, %d chars used)\n",
ndx, c[ndx], n);
}
( note: , с помощью isalpha()
в сравнении он будет обрабатывать как символы верхнего, так и нижнего регистра, вы можете настроитьпо желанию, просто проверяя верхний / нижний регистр или просто конвертируя все символы в один или другой регистр)
Пример Использование / Вывод
$ echo "hello" | ./bin/mostfreqchar3
most frequent char: l (occurs 2 times, 5 chars used)
( примечание: если вы используете "heello"
, вы все равно получите "most frequent char: e (occurs 2 times, 6 chars used)"
, поскольку 'e'
является первым из двух символов, которые встречаются одинаковое количество раз)
Существует много способов обработкипроблемы с частотой, но по сути все ониork таким же образом. С помощью символов ASCII вы можете захватить как наиболее часто встречающийся символ, так и число раз, которое он встречается в одном массиве int
и int
, содержащих индекс, на котором происходит максимум. (индекс вам на самом деле тоже не нужен - он просто сохраняет циклы, чтобы найти его каждый раз, когда он необходим).
Для более сложных типов вы обычно будете использовать простую структуру для хранения счетчика иобъект. Например, если вы ищете наиболее частое слово , вы обычно используете такую структуру, как:
struct wfreq {
char *word;
int count;
}
Тогда вы просто используете массив struct wfreq
таким же образомВы используете свой массив int
здесь. Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.