Ваша проблема
while(userChar == '\n');
Когда вы читаете 'A'
в "Apple"
, userChar
не == '\n'
не приводит к прекращению вашего действия после первой итерации. То, что вы намеревались было:
while(userChar != '\n');
( примечание "!="
вместо "=="
)
При этом ваш код должен работать, хотя нет необходимости использовать отдельные userChar
и userCharVal
.
Чтобы немного разобраться, просто используйте один int
, чтобы прочитать символ с getchar()
, нет необходимости в scanf
(и его лучше избегать). Требуется дополнительная проверка того, что символ равен [a-zA-Z]
, чтобы убедиться, что вы увеличиваете допустимый индекс на histo[userCharVal - 65]
. (и не используйте цифры типа 65
, когда вы можете использовать 'A'
, чтобы четко указать, что вы делаете)
В целом, вы можете сделать что-то похожее на:
#include <stdio.h>
#include <ctype.h>
#define NCHR 26 /* to cover each character in the alphabet */
int main (void) {
int frequency[NCHR] = {0}, /* frequency of each char initialized to zero */
c; /* character returned by getchar() */
fputs ("enter a line of text: ", stdout);
while ((c = getchar()) != '\n' && c != EOF) /* read each char */
if (isalpha(c)) /* validate a-zA-Z */
frequency[toupper(c) - 'A']++; /* increment element */
puts ("\nfrequency of characters:\n");
for (c = 0; c < NCHR; c++)
if (frequency[c]) /* output lowercase per your example */
printf (" %c : %d\n", c + 'a', frequency[c]);
}
( примечание: также требуется дополнительная проверка против EOF
. Нет гарантии на '\n'
Пользователь может сгенерировать руководство EOF
с помощью Ctrl + d в Linux или Ctrl + z в Windows, чтобы обозначить конец ввода или полностью отменить ввод)
Пример использования / Вывод
$ ./bin/charfreqarray
enter a line of text: Apple
frequency of characters:
a : 1
e : 1
l : 1
p : 2
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.