2015-05-04 30 views
1

我已經在我的C程序中編寫了以下函數。該程序加載一個文本文件(Les Miserables Vol。I)以及另外20個字符名稱的文本文件。此功能的目的是逐行掃描整個文件,並計算20個名稱中任何一個出現的次數。我在哪裏得到這個函數去做我想做的事情?

NumOfNames = 20

Names是從Names[1]存儲在20個名稱的數組 - Names[20]

MaxName是一個全局整型變量,我希望在整個文件中存儲名稱外觀的總數(它應該在數百甚至數千)。

編輯:該函數執行後,MaxName的值是4.我完全失去了我犯了一個錯誤,但似乎在整個函數中犯了幾個錯誤。一個似乎是它只執行for循環的第一次迭代,即它只搜索Name[1],但名字在文件中出現196次,所以它仍然沒有正確地爲第一個名稱正確工作。

void MaxNameAppearances() 
{ 
    char LineOfText[85]; 
    char *TempName; 
    FILE *fpn = fopen(LesMisFilePath, "r+"); 

    for(i = 1; i<=NumOfNames; i++) 
    { 
     while(fgets(LineOfText, sizeof(LineOfText), fpn)) 
     { 
      TempName = strstr(LineOfText, Names[i]); 

      if(TempName != NULL) 
      { 
       MaxName++; 
      } 
     } 
    } 

    fclose(fpn); 
} 
+0

你對代碼有什麼問題? –

+1

你應該注意到數組在C中以索引0開頭,所以'Names'不是'Names [1] - Names [20]',而是'Names [0] - Names [19]'。 –

+0

我知道,但我創建了數組,以便第一個元素爲空,然後下列元素保存名稱1-20。我的程序需要將名稱存儲在數組中的正確位置(名稱[1]中的第一個名字等)。 – KOB

回答

1

我想代碼的一個問題是它必須在每次迭代i時讀取文件。嘗試重新整理這樣的循環:

while(fgets(LineOfText, sizeof(LineOfText), fpn)) 
{ 
    for(i = 1; i<=NumOfNames; i++) 
    { 
     TempName = strstr(LineOfText, Names[i]); 
     if(TempName != NULL) 
     { 
      MaxName++; 
     } 
    } 
} 

這讀取一行,檢查在該行的所有名稱的occurrances然後繼續到下一行。

如果按照自己的方式進行操作,那麼您已經在i == 1的文件末尾。

+0

這引發了其中一個問題。我認爲推薦使用通常的'for(i = 0; ...; ...)'風格也是有意義的。 OP使用的循環根本不是C語言。如果數組聲明使用20的大小,我不會感到驚訝,當他們最終開始使用非法的'Name [20]'時,會有一個微妙的錯誤等待發生。 – ArjunShankar

+0

隨着代碼被編輯爲您的建議,'MaxName'現在在函數結束時的值爲14,而它應該在數百乃至數千。 @ArjunShankar我有'char ** Names'聲明爲一個全局變量,然後在前一個函數中我有: 'Names = malloc((NumOfNames + 1)* sizeof(* Names));' 這應該適合'Name [20]',不是嗎? – KOB

+0

@KOB有一個額外的元素並從1開始而不是0開始計數可能是正確的。但它不是慣用的C.即人們通常不會這樣寫。這很混亂。有一天,你會忘記1個額外的元素;或其他人會讀你的代碼,並感到困惑。最好從0開始計數。這就是說,這顯然不是問題。我們的問題是:如果我們沒有[完整示例](http://sscce.org/),我們無法調試您的問題,我們可以編譯並運行以查看自己。另外,你通過不使用[調試器](http://en.wikipedia.org/wiki/Debugger)浪費自己的時間。 – ArjunShankar

相關問題