我正在尝试计算字典中单词的开头频率,其中包含cca 140 000个单词。我保存数组 count 中的频率,字母a的count [0],字母b的count [1] ...但是,当我总结数组 count < / strong>,该值不等于字典中的单词总数。我发现如果我将字典大小减少到95137,数字相等,但是一旦字典有超过95137个单词,count [0]到count [4]的值突然变得非常大。我不明白为什么......这是我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
FILE *fp = fopen("testdic.txt", "r");
int count[26];
char buffer[30];
for (int i = 0; i < 26; i++)
count[i] = 0;
int total = 0;
while (1)
{
fscanf(fp, "%s", buffer);
if (feof(fp))
break;
count[buffer[0]-97] ++;
total++;
if (count[0] > total) // I used this to find out where the jump occurs
break;
}
printf("%d ", i);
for (int i = 0; i < 26; i++)
printf("%d " , count[i]);
}
答案 0 :(得分:3)
很难知道为什么这段代码会产生奇怪的输出,因为你忘记了几次调试检查。
feof
; fopen
返回值; scanf
返回值; buffer[0]
值; buffer
中查看%s
长度。答案 1 :(得分:1)
在本声明count[buffer[0]-97] ++;
中,您正在考虑通过获取起始字母的ascii值并减去97(即a
的ascii值)来获得索引。我不确定您是否打算处理以大写字母开头的单词,例如Ascii
buffer[0]
为65且表达式buffer[0] - 97
的结果为负整数。这可能会导致堆栈损坏。
答案 2 :(得分:0)
不知道这是不是问题,但是你的代码应该关心这些单词中是否包含奇数字符。 所以,干脆做
count[buffer[0]-97]
如果你问我,有点鲁莽!在执行该行之前,我确保buffer[0] >=97 & buffer[0]<97+26
。否则,谁知道你在增加什么!
- 难道你的第95138个单词以一个有趣的角色开头吗?
答案 3 :(得分:0)
你的total
变量是在你的count
数组之后声明的 - 所以当你走出数组的界限时,你就搞乱了一切。一个小于'a'的角色会特别糟糕 - 但坦率地说,第一个大写字母就足够了。使用count[(buffer[0]-'a')%26]++
- 模数除法会强制您保留在数组中。这是一个kluge,但如果可行,你可以开始寻找坏人物。