-1

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

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

key2 计算机科学副教授 Patrick Eugster 的项目地理分布式大数据处理项目获得了谷歌赞助的研究奖 key2,该项目是与博士的联合工作。学生 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;
}

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

4

3 回答 3

1

我没有遵循您的所有代码,但可能是这样的:

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

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

if ((isspace(ch)|| ch =='\n' || ch =='\t') && (buffer++ < bufferSize))
于 2013-04-27T21:41:17.137 回答
1

这是基于您的代码的 SSCCE(简短、独立、正确的示例)。我已经简化了搜索功能的界面;它不再占用原始代码所占用的缓冲区大小或起始偏移量。无论如何,原始代码并没有真正使用它们。

#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

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

于 2013-04-28T00:30:19.840 回答
0

搜索方法没有明显的问题,因此您可能需要更新一些有关您如何使用它的上下文。抛开随机不谈,这段代码中的增量是多余的:

currentWord[i++] = '\0';
i = 0
于 2013-04-27T21:40:09.420 回答