2017-02-21 184 views
0

我想使用strtok將文本文件拆分爲字符串,我可以傳遞給拼寫檢查功能,文本文件包含字符,如'\ n','?!,。 「 etc ... 我需要打印任何拼寫檢查失敗的單詞以及它們所在的行號。保持跟蹤線是我正在努力。 到目前爲止我試過,但它只返回結果的文本文件的第一行:C - 使用strtok嵌套循環使用strtok

char str[409377]; 
fread(str, noOfChars, 1, file); 
fclose(file); 

int lines=1; 
char *token; 
char *line; 
char splitLine[] = "\n"; 
char delimiters[] = " ,.?!(){}*&^%$£_-+="; 
line = strtok(str, splitLine); 
while(line!=NULL){ 
    token = strtok(line, delimiters); 
    while(token != NULL){ 
     //print is just to test if I can loop through all the words 
     printf("%s", token); 
     //spellCheck function & logic here 
     token = strtok(NULL, delimiters); 
    } 
    line = strtok(NULL, splitLine); 
    lines++ 
} 

使用嵌套while循環和函數strtok可能嗎?有沒有更好的方法來跟蹤行號?

回答

0

strtok功能不是折返!它不能用於同時標記多個字符串。這是因爲它保持了當前被標記的字符串的內部狀態。

如果你有一個現代化的編譯器和標準庫,那麼你可以用strtok_s代替。否則,你必須想出另一種解決方案。

+0

好的,謝謝你清理那個,你能想出一個更好的方法來跟蹤令牌的哪一行嗎?編輯:好吧,我會研究,非常感謝你的幫助 –

0

您可以使用strtok,但它不是很容易使用。這是一個愚蠢的函數,它所做的只是用nuls代替分隔符,並返回一個指向它已經分隔的序列開始的指針。所以它具有破壞性。它不能處理像英文單詞被允許使用單撇號這樣的特殊情況(我們是一個詞,我們不是),您必須確保您具體列出所有分隔符。

這可能是最好的自己寫mystrok,所以你明白它是如何工作的。然後用它作爲你自己的單詞提取器的基礎。

你的錯誤的原因是你砍掉第一行,那就是strok在後續調用中看到的所有東西。