2014-10-22 4 views
0

Этот сегмент кода, который у меня есть, является частью гораздо более крупного кода, но этот сегмент, в котором он в основном работает, является поисковым словом(); функция использует strstr для поиска всех слов, соответствующих слову слова ввода пользователя, помещает исходную позицию слова в массив целых чисел keywordsat [], чтобы я мог использовать его в строке текста печати 1. какой поисковый запрос(); return - это всего лишь количество найденных слов или 0, когда слова не найдены, dosent имеют слово. printsummary() и wordfoundYN не имеют значения для этого бита кода. Также несут в моем сообщении [] абзац, с \n и прочее.Поиск слов в строке манипуляции

Таким образом, в основном этот код функционирует должным образом, он находит ключевые слова в массиве message [] и возвращает начальные позиции слов, помещает их в ключевые слова []. Затем, чтобы напечатать только одну строку, я возвращаюсь до предыдущего символа \n, после чего я просто печатаю до следующего символа \n, тем самым распечатывая строку абзаца, в котором содержится слово.

Но у меня есть проблема, скажем, предположим, что message[]={"\n the cat is in the bag.\n"} , а затем пользователь вводит поиск слова как «он», он дважды печатает одну и ту же строку в параграфе, так как он дважды нашел слово в предложении, keywordat [] заполнил 2 номера keywordat [0] = 1 и keywordat [1] = 16. Мне было интересно, если бы в любом случае для этой программы было известно, что если 2 слова находятся в одной строке, не печатайте одну и ту же строку дважды?

... 
       searchwordYN=searchword(); 
        if(searchwordYN!=0){ 
         printsummary(d); 
         wordfoundYN++; 
         counter=0; 
         while(counter<searchwordYN){ 
           i=keywordsat[counter]; 
           while(i>=0){ 
            if(message[i]=='\n'){ 
             break; 
            } 
            i--; 
           } 

           for(f=i+1;f<10485760;f++){ 
             if(message[f]=='\n'){ 
              break; 
             } 
            printf("%c", message[f]); 
           } 
           printf("\n"); 
           counter++; 
         } 
         counter=0; 
        } 
... 

Мой Поиск слова функция():

int searchword(){ 
    char *ret; 
    int i=0; 

    ret = strstr(message, keyword); 
    if(ret==NULL){ 
     return 0; 
    } 
    while(ret!=NULL) 
    { 
     keywordsat[i]=ret-message; 
     i++; 
     ret++; 
     ret = strstr(ret, keyword); 
    } 
    return i; 
} 
+0

Одна из проблем заключается в том, что у вас слишком много уровней отступов для комфорта. Вы должны посмотреть, как реорганизовать ваш код на более мелкие функции. В первом фрагменте имеется только 6 уровней вдавливания, и, похоже, это может быть на 3 или 4 уровня отступа, прежде чем вы перейдете к этому коду. Страшно! Трудно справиться точно. –

ответ

0

Одним из способов было бы сохранить последнюю позицию начала строки (значение I)

что-то подобное может работать:

searchwordYN=searchword(); 
    if(searchwordYN!=0){ 

     //old start of line needs to be initialized by something bigger than file size 

     int oldStartOfLine = 10485760 + 1; 

     printsummary(d); 
     wordfoundYN++; 
     counter=0; 
     while(counter<searchwordYN){ 

      i=keywordsat[counter]; 
      while(i>=0){ 
       if(message[i]=='\n'){ 
        break; 
       } 
       i--; 
      } 
      if(i != oldStartOfLine){ 

       // only do the print out if this is a new line. 

       for(f=i+1;f<10485760;f++){ 
        if(message[f]=='\n'){ 
         break; 
        } 
        printf("%c", message[f]); 
       } 
      } 
      printf("\n"); 

      // save old start of line 
      oldStartOfLine = i; 
      counter++; 
     } 
     counter=0; 
    } 

В конце концов:

Не бойтесь использовать атрибуты для функций вместо использования глобальных переменных. Делает это лучше.

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