C 搜索函数返回错误的计数

C 搜索函数返回错误的计数,c,C,我有一个搜索功能,我知道这是一个问题,但似乎无法解决它。 我正在使用该函数在我的子进程中进行搜索 这是我正在使用的测试文件 key2计算机科学副教授Patrick Eugster因其项目地理分布大数据处理(Geo Distributed Big Data Processing)而获得了key2 Google赞助研究奖,该项目是与博士共同完成的。学生Chamikara Jayalath和Julian Stephe 23456 key1 2013年2月21日,普渡大学科学院年度教师和员工奖励计划表彰

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

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

key2计算机科学副教授Patrick Eugster因其项目地理分布大数据处理(Geo Distributed Big Data Processing)而获得了key2 Google赞助研究奖,该项目是与博士共同完成的。学生Chamikara Jayalath和Julian Stephe 23456 key1 2013年2月21日,普渡大学科学院年度教师和员工奖励计划表彰了几名计算机科学教师和员工。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;
}
int搜索(FILE*FILE,char*key,int bufferSize,long int start)
{
int-wordCtr=0;
int缓冲区=0;
如果(文件!=NULL)
{
printf(“文件中位置%ld处的测试1”,ftell(文件));
fseek(文件、开始、搜索集);
int-ch,word=0;
字符当前字[最大字长度];
int i=0;
int计数器=0;
while((ch=fgetc(文件))!=EOF&&counter

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

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

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

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

if (isspace(ch)|| ch =='\n' || ch =='\t' && (buffer++ < bufferSize))
if(isspace(ch)| | ch='\n'| | ch='\t'&(buffer++
测试
ch='\t'&(buffer++
绑定在一起。这真的是你想要的吗?我想你是说

if ((isspace(ch)|| ch =='\n' || ch =='\t') && (buffer++ < bufferSize))
if((isspace(ch)| ch='\n'| ch='\t')&(buffer++
这是一个基于您的代码的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);
}

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

不,情况并非如此。在发布之前,我已经用这种方式进行了测试。但这无疑是一种更好的编码方式,而不是“更好的编码方式”,因为这些版本具有完全不同的语义。一个是正确的,一个不是。无论如何,我将尝试查找其他问题。请注意,
isspace()
检查
'
'\t'
'\n'
'\f'
'\v'
'\r'
因此
|
术语是多余的。
isblank()。是否需要指定要逐个读取的缓冲区大小?isspace是正确的('\n','\t')不会破坏您的问题。我已为您回滚编辑。您是否尝试使用调试器
key1: 4
key2: 3