数组 - 价值跳跃

时间:2013-02-16 14:45:59

标签: c arrays

我正在尝试计算字典中单词的开头频率,其中包含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]);

}

4 个答案:

答案 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,但如果可行,你可以开始寻找坏人物。