2013-04-27 6 views
-1

У меня есть функция поиска, которая, как я знаю, является проблемой, но не может ее исправить. Я использую функцию для поиска в моих дочерних процессах.Функция поиска возвращает неправильный счет

Это тестовый файл я использую

доцент key2 компьютерных наук Патрик Eugster является получателем спонсируемого исследования премии key2 Google для своего проекта Geo-Distributed Big Data Processing, которая является совместная работа с доктором философии. студенты Chamikara Jayalath и Julian Stephe 23456 key1 Несколько преподавателей и сотрудников компьютерных наук были признаны в ежегодной программе преподавателей и преподавателей Университета Пердью в университете 21 февраля 2013 года. key2 Несколько преподавателей и сотрудников компьютерных наук были признаны в Университете Пердью колледж ежегодного факультета ключевых сотрудников программы Награды науки 21 февраля 2013 г. key1 key1 key1 Несколько компьютерных наук преподаватели и сотрудники признали в Purdue

я должен получить результат в

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; 
} 

Пожалуйста, дайте мне знать, если больше кода не требуется.

+0

У вас возникли проблемы с номером, который вы задали в качестве размера буфера. Нужно ли указывать размер буфера для чтения по одному? isspace верно, что ('\ n', '\ t') – BLUEPIXY

+0

Do ** not ** destroy your question. Я откат вашего редактирования для вас. –

+0

сделал u попытался использовать отладчик – pm100

ответ

0

В методе поиска нет ничего плохого, поэтому вам, вероятно, придется обновить какой-то контекст о том, как вы его используете. Random в стороне, прирост этого кода является излишним:

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

я не следовал всему коду, но это может быть так:

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

тесты ch =='\t' && (buffer++ < bufferSize) связаны между собой. это то, что вы хотите? Я думаю, что вы имели в виду

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

нет, что нет. Я протестировал его таким образом, прежде чем публиковать его.Но это лучший способ кодировать без сомнения. – Mani

+0

это не «лучший способ кодирования», так как эти версии имеют совершенно другую семантику. один правильный, один нет. Во всяком случае, я попытаюсь найти другие проблемы. – Elazar

+2

Обратите внимание, что 'isspace()' проверяет '' '', '' \ t'', '' \ n'', '' \ f'', '' \ v'', '' \ r'' так термины '||' являются избыточными. Функция 'isblank()' проверяет '' '' и '' \ t''. –

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 

Ваши основные проблемы были с размером буфера и числом различных способов вы подсчета количества символов в слово.

Смежные вопросы