Я играл с каким-то старым кодом, и я наткнулся на функцию, которую я сделал некоторое время go, которая вычисляет количество раз, когда каждая буква алфавита появляется в данной строке. В моей первоначальной функции я бы провел oop через строку 26 раз, посчитав, сколько раз каждая буква появляется, когда она повторяется. Однако я знал, что это действительно неэффективно, поэтому вместо этого я попытался сделать это:
int *frequency_table(char *string) {
int i;
char c;
int *freqCount = NULL;
freqCount = mallocPtr(freqCount, 26, sizeof(int), "freqCount"); /* mallocs and checks for out of memory */
for (i = 0; string[i] != '\0'; i++) {
c = string[i];
if (isalpha(c)) {
isupper(c) ? freqCount[c - 65]++ : freqCount[c - 97]++;
}
}
return (freqCount);
}
Приведенный выше код перебирает строку и проверяет каждый символ. Если символ представляет собой букву c в алфавитном порядке (az или AZ), то я увеличиваю счетчик частоты с указанным индексом c в массиве freqCount
(где индекс 0 = a \ A, 1 = b \ B, ..., 25 = z \ Z).
Код выглядит нормально, но при печати массива я получаю следующий вывод:
Строка: "abcdefghijklmnopqrstuvwxyziii"
a/A -1276558703
b/B 32754
c/C -1276558703
d/D 32754
e/E 862570673
f/F 21987
g/G 862570673
h/H 21987
i/I 4
j/J 1
k/K 1
l/L 1
m/M 1
n/N 1
o/O 1
p/P 1
q/Q 1
r/R 1
s/S 1
t/T 1
u/U 1
v/V 1
w/W 1
x/X 1
y/Y 1
z/Z 1
Для справки, я печатаю массив следующим образом:
for (i = 0; i < 26; i++) {
printf("%c/%c %d\n", i + 97, i + 65, freqCount[i]);
}
Я проверил, чтобы убедиться, что указатель выделен правильно, я точно знаю, что не перезаписывал эту ячейку памяти. Может быть, я что-то упускаю, но я действительно не могу понять, почему он печатает значения мусорной памяти из \ Ah \ H.
Кроме того, если есть более эффективный способ сделать то, что я пытаюсь Я бы хотел это услышать.
Спасибо