2011-10-23 51 views
-3

我正在解析文本文件,當遇到單詞.word時,我想抓住該行的其餘部分。這是我到目前爲止:指向字符串的指針 - C

char *word_ptr; 

if (strstr(token, ":")){ 
    // Some code 

} 

else if ((word_ptr = strstr(token, ".word"))) { 
    char *string_wanted = word_ptr + 6; 
    printf("Rest: '%s'\n", string_wanted); 
} 

string_wanted打印不正確。在else-if聲明中分配word_ptr時,我的用法是否正確? string_wanted沒有打印出任何東西。當我添加一個7而不是6時,它會打印出'ize'。我在文本文件中保留了字的大小,但現在我刪除了它,刪除了該文件並重新創建了它,並完成了一個乾淨的構建,單詞「ize」仍顯示出來!它在文件中根本不存在,所以它來自哪裏?我非常沮喪,文件中不再存在「大小」這個詞。

以下是文件中查找內容(當我有「IZE」字):

array: .word 0:10 
array_size: .word 10 

現在我只是刪除第二行,所以它是: array: .word 0:10

爲什麼不word_ptr打印出0:10當我添加一個6呢?我很確定word_ptr指向.word,因爲當我打印它時,它會打印.word。標記行時,array:正在標記化,所以我知道它正在到達那裏。

有什麼建議嗎?

感謝您的幫助。

+0

你嘗試過在strstr上測試NULL嗎? – Serdalis

+1

我爲什麼要測試?如果代碼塊不是空的,它只會執行嗎? – darksky

+0

這是真的,這個代碼的唯一問題是,它永遠不會到別人如果(與您提供的測試用例),當我修復了我的程序中的一切工作,因爲它應該,請張貼完整的代碼,代碼你發佈了沒有問題。 – Serdalis

回答

2

我們在這裏圈了一圈。我想我現在看到你的困惑在哪裏,所以我會試着去解決它。您的標記器正在取出一個字符串並將其分解爲令牌。這些令牌中的每一個都是獨立的字符串。你不指定你正在標記的字符,所以我會假設空間字符。

在這種情況下,字符串:

陣列:.word 0:10

成爲三個新的字符串:

「陣列」

」。字「

」0:10「

如果您在您的令牌循環(看來你是),那麼第一次通過循環token將「陣列」,第二次是將「.word」和第三次它會是「0:10」。

此評價:

word_ptr = strstr(token, ".word") 

只將在token包含 「.word」 的迭代過程中發現 「.word」。然後,當您將word_ptr增加6個字符時,您已經移動到token的末尾,進入未定義的內存。是的,「0:10」出現在原始字符串中的「.word」後面的兩個字符,但我們並沒有在您致電strstr時查看原始字符串。我們只看到tokentoken只包含「.word」。

這就是爲什麼它失敗。如何解決它取決於你的實現的其餘部分。

+0

這正是發生的情況。我沒有意識到標記化實際上會將字符串拆分爲單獨的字符串。非常感謝。我需要找到一種方法來獲取下一個令牌。 – darksky

2

當您將*string_wanted設置爲word_ptr + 6時,您指向string_wanted處的終止字符串的null。所以當你試圖打印*string_wanted時你會得到一個空字符串。嘗試獲取下一個標記。

+0

它爲什麼指向'null'? 'word_ptr + 6'沒有把它移到右邊的六個位置,因此指向'0:10'字符串的'0'? – darksky

+0

我假設你在空間上進行標記,所以'token' ='「.word」'。也許你應該添加你的令牌化代碼。 – ObscureRobot

+0

是的,我也在空間上進行標記。但是不應該增加指針仍然工作? – darksky

0

難道你的if (strstr(token, ":"))對你所有的字符串都是正確的嗎?它永遠不會涉及到你所問的代碼塊。

+0

很好,謝謝。 – iehrlich

+0

哦,請不要這樣。它實際上達到了我的代碼塊,我爲讀者提供了一系列簡化的條件。我只是想表明我在if-else語句塊中有這個。 – darksky

+0

您應該將您的問題更新爲證明錯誤的最低必要條件,並且自己測試一下最低限度,以驗證問題是否仍然存在,以確保您沒有看到我們不知道的代碼的副作用。 – goto10