-1

問題があるとわかっている検索機能がありますが、修正できないようです。子プロセスを検索する機能を使用しています。

これは私が使用しているテストファイルです

key2 コンピューター サイエンスの准教授 Patrick Eugster は、博士号との共同作業である彼のプロジェクト Geo-Distributed Big Data Processing で、key2 Google の後援研究賞を受賞しています。学生 Chamikara Jayalath と Julian Stephe 23456 key1 2013 年 2 月 21 日に開催されたパデュー大学理学部の年次教員およびスタッフ アワード プログラムで、数人のコンピュータ サイエンスの教職員が表彰されました。 key2 数人のコンピュータ サイエンスの教職員がパデュー大学で表彰されました。 2013 年 2 月 21 日に開催された、理学部の年次教員キー スタッフ アワード プログラム。

で結果を取得する必要があります

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 ( 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

あなたの主な問題は、バッファ サイズと、単語内の文字数を数えるさまざまな方法の数にありました。

于 2013-04-28T00:30:19.840 に答える
0

検索方法に明らかに問題があるわけではないので、使用方法に関するコンテキストを更新する必要があるでしょう。ランダムではありますが、このコードのインクリメントは冗長です。

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