搜索功能返回错误的计数

时间:2013-04-27 21:33:19

标签: c

我有一个搜索功能,我知道这是问题,但似乎无法修复它。 我正在使用该功能在我的子进程中进行搜索。

这是我正在使用的测试文件

  

key2计算机科学副教授Patrick Eugster是他的项目Geo-Distributed Big Data Processing的赞助研究奖key2 Google的获得者,该项目与博士共同合作。学生Chamikara Jayalath和Julian Stephe 23456 key1 2013年2月21日,几位计算机科学教职员工在普渡大学科学学院的年度教职员工奖项计划中获得认可.key2几位计算机科学教职员工在普渡大学获得认可2013年2月21日,科学学院年度教师关键员工奖项计划.key1 key1 key1在普渡大学获得认可的几位计算机科学教职员工

我应该在

得到结果
key1: 4
key2: 3

但是我的结果是

key1: 4
key2: 1

我哪里错了?

以下是代码:

int search(FILE *file, char *key, int bufferSize, long int start)
{
    int wordCtr = 0;
    int buffer = 0;
    if ( file != NULL )
    {
        printf("test 1 at position %ld in file\n", ftell(file));
        fseek(file, start, SEEK_SET);
        int ch, word = 0;
        char currentWord[MAX_WORD_LEN];
        int i = 0;
        int counter = 0;
        while ((ch = fgetc(file)) != EOF && counter < MAX_BUFFER_SIZE-1)
        {
            counter++;
            if (isspace(ch)|| ch =='\n' || ch =='\t' && (buffer++ < bufferSize))
            {
                if(word)
                {
                    word = 0;
                    currentWord[i++] = '\0';
                    i = 0;
                    if(!strcmp(currentWord, key))
                    {
                        wordCtr++;
                    }
                }
            }
            else
            {
                word = 1;
                currentWord[i++]=ch;
            }
        }
    }
    return wordCtr;
}

如果需要更多代码,请告诉我。

3 个答案:

答案 0 :(得分:1)

我没有按照你的所有代码,但可能是这样:

if (isspace(ch)|| ch =='\n' || ch =='\t' && (buffer++ < bufferSize))

测试ch =='\t' && (buffer++ < bufferSize)绑在一起。那真的是你想要的吗?我想你的意思是

if ((isspace(ch)|| ch =='\n' || ch =='\t') && (buffer++ < bufferSize))

答案 1 :(得分:1)

根据您的代码,这是一个SSCCE(Short, Self-Contained, Correct Example)。我简化了搜索功能的界面;它不再需要原始代码所采用的缓冲区大小或起始偏移量。无论如何,原始代码并没有真正使用它们。

#include <ctype.h>
#include <stdio.h>
#include <string.h>

enum { MAX_WORD_LEN = 64 };

static
int search(FILE *file, char *key)
{
    int wordCtr = 0;
    fseek(file, 0L, SEEK_SET);
    int ch, word = 0;
    char currentWord[MAX_WORD_LEN];
    int i = 0;
    while ((ch = fgetc(file)) != EOF && i < MAX_WORD_LEN-1)
    {
        if (isspace(ch))
        {
            if (word)
            {
                word = 0;
                currentWord[i] = '\0';
                i = 0;
                //printf("compare: [[%s]] vs [[%s]]\n", key, currentWord);
                if (strcmp(currentWord, key) == 0)
                    wordCtr++;
            }
        }
        else
        {
            word = 1;
            currentWord[i++] = ch;
        }
    }
    return wordCtr;
}

static void print_search(FILE *fp, char *key)
{
    int n = search(fp, key);
    printf("%s: %d\n", key, n);
}

int main(void)
{
    FILE *fp = fopen("text", "r");
    if (fp != 0)
    {
        print_search(fp, "key1");
        print_search(fp, "key2");
    }
    return(0);
}

根据问题中的输入文本,输出符合预期:

key1: 4
key2: 3

您的主要问题在于缓冲区大小以及计算单词中字符数的不同方式的数量。

答案 2 :(得分:0)

搜索方法没有明显的错误,因此您可能需要更新一些关于如何使用它的上下文。 除了随机,此代码中的增量是多余的:

currentWord[i++] = '\0';
i = 0