我正在尝试计算一个文本块中的三元组或三个字母序列的数量。我已经有一些代码可以使用二维数组成功计算二元组(2 个字母序列)的数量,但是我在更改它以接受三元组时遇到了一些麻烦。
#include <stdio.h>
int main(void) {
int count['z' - 'a' + 1]['z' - 'a' + 1] = {{ 0 }};
int c0 = EOF, c1;
FILE *plain = fopen("filename.txt", "r");
if (plain != NULL) {
while ((c1 = getc(plain)) != EOF) {
if (c1 >= 'a' && c1 <= 'z' && c0 >= 'a' && c0 <= 'z') {
count[c0 - 'a'][c1 - 'a']++;
}
c0 = c1;
}
fclose(plain);
for (c0 = 'a'; c0 <= 'z'; c0++) {
for (c1 = 'a'; c1 <= 'z'; c1++) {
int n = count[c0 - 'a'][c1 - 'a'];
if (n) {
printf("%c%c: %d\n", c0, c1, n);
}
}
}
}
return 0;
}
编辑:这是我已经尝试过的代码。我希望将 2d 数组扩展为 3d 数组,但这不会返回任何内容。
#include <stdio.h>
int main(void) {
int count['z' - 'a' + 1]['z' - 'a' + 1]['z' - 'a' + 1] = {{{ 0 }}};
int c0 = EOF, c1, c2;
FILE *plain = fopen("filename.txt", "r");
if (plain != NULL) {
while ((c1 = getc(plain)) != EOF) {
if (c1 >= 'a' && c1 <= 'z' && c0 >= 'a' && c0 <= 'z' && c2 >= 'a' && c2 <= 'z') {
count[c0 - 'a'][c1 - 'a'][c2 - 'a']++;
}
c0 = c1;
c1 = c2;
}
fclose(plain);
for (c0 = 'a'; c0 <= 'z'; c0++) {
for (c1 = 'a'; c1 <= 'z'; c1++) {
for (c2 = 'a'; c2 <= 'z'; c2++) {
int n = count[c0 - 'a'][c1 - 'a'][c2 - 'a'];
if (n) {
printf("%c%c%c: %d\n", c0, c1, c2, n);
}
}
}
}
}
return 0;
}
例如,此代码打印所有出现的二元组,例如 aa、ab、ac 等。但我需要它来计算 aaa、aab、... zzz 的出现次数。任何帮助将不胜感激!
编辑 2:现在它成功打印了正确的输出,但它需要按降序排列(顶部最常用的三元组)