2014-10-22 79 views
0

我這段代碼是一個更大的代碼的一部分,但這個片段基本上做的是searchword();函數使用strstr查找與用戶輸入相匹配的所有單詞輸入搜索詞將單詞的初始位置放入keywordsat []整型數組中,以便我可以將它用於文本的print 1行。什麼searchword();返回僅僅是發現的詞的數量或者當沒有詞被發現時爲0,劑量有詞。 printsummary()和wordfoundYN與此代碼位無關。另外在我的消息[]中是一段,用\n和東西。單詞搜索字符串操作

因此,基本上這段代碼目前正常運行,它會在消息[]數組中找到關鍵字並返回這些字的起始位置,並將它們放入關鍵字at []中。然後,爲了只打印1行我回去,直到前面的\n字符的話,我只需打印,直到下一個\n字符,因此打印出來的字被包含在該段線路。

但是我有一個問題,讓假設我們假設message[]={"\n the cat is in the bag.\n"} ,然後用戶輸入搜索單詞爲「the」,它會在段落中打印同一行兩次,因爲它在該句子中發現了兩次單詞,keywordsat []將填充2個數字keywordsat [0] = 1和keywordsat [1] = 16。我想知道是否有這個程序知道,如果兩個單詞在同一行,不打印同一行兩次?

... 
       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個縮進級別,然後才能到達該代碼。害怕!很難準確管理。 – 2014-10-22 05:22:50

回答

0

一種方法是保存行(我的價值)開始的最後位置

這樣的事情可能工作:

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

最後提示:

不要害怕將屬性用於函數而不是使用全局變量。使它更好。