2012-01-23 61 views
2

我正在使用特定的分隔符並行解析3個值。帶連續分隔符的strtok_s行爲

token1 = strtok_s(str1, separator, &nextToken1); 
token2 = strtok_s(str2, separator, &nextToken2); 
token3 = strtok_s(str3, separator, &nextToken3); 

while ((token1 != NULL) && (token2 != NULL) && (token3 != NULL)) 
{ 
    //... 
    token1 = strtok_s(NULL, separator, &nextToken1); 
    token2 = strtok_s(NULL, separator, &nextToken2); 
    token3 = strtok_s(NULL, separator, &nextToken3); 
} 

假設' - '是我的分隔符。該行爲是不連續的分隔符的字符串:

1-2-3-45 

將有效地導致這些部分組成:

1 
2 
3 
45 

然而,隨着連續兩個分隔的字符串:

1-2--3-45 

將不會產生長度爲0的字符串,則跳過該字符串,結果如下:

1 
2 
3 
45 

,而不是

1 
2 

3 
45 

什麼辦法或策略會更適合獲得所有實際部分,包括0長度的呢?如果可能,我想避免重新實現strtok_s。

+0

strtok()是邪惡的,因爲它修改了輸入字符串。除此之外,我很好奇這個答案。 –

+0

在我的情況下,strtok可以修改字符串的所有想要的,我保持原來的和工作的副本。 – MPelletier

+0

我進入了微軟的strtok_s.inl,看到這確實是預期的行爲,因爲有第一個「非分隔符」字符的前導分隔符跳過。嗯... – MPelletier

回答

6

不幸的是,strtok()忽略了空的標記。儘管你說你希望避免這樣做,但除了自己解析它外,沒有別的辦法,例如使用strchr()來查找下一個分隔符,然後將該標記複製到臨時變量進行處理。這樣你可以根據你的需要處理空的代幣。

1

是的,這是這個功能的工作方式。對於解析多個空白字符不應被視爲空白字符的單詞這樣的任務更爲合適。

我已經做了很多解析。我只會在這裏編寫我自己的解析器,代碼一次檢查一個字符。這並不難,你可以讓它表現出你需要的。舉例來說,我發佈了一些C++代碼來解析我的文章中的CSV文件Reading and Writing CSV Files in MFC