2012-01-23 20 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

私はMicrosoftのstrtok_s.inlに入って、最初の「区切り文字ではない」文字に先頭の区切り文字がスキップされているため、実際にはこれが期待される動作であることがわかりました。うーん... – MPelletier

答えて

6

でCSVファイルを解析するために、いくつかのC++のコードを掲載しました。あなたがそれを避けたいと言ったとしても、それ以外の方法はありません。たとえば、strchr()を使って次の区切り文字を見つけて、そのトークンを一時変数にコピーして処理します。この方法で空のトークンを処理できます。

1

はい、これはこの機能が動作する方法です。複数の空白文字を空の単語として扱うべきでない単語の解析などのタスクには、より適切です。

私は多くの解析を行っています。ここでは、コードが一度に1つの文字を調べる場所に、私自身のパーサーを書くだけです。それはそれほど難しいことではなく、あなたが必要とするように正確に動作させることができます。例として、私は残念ながら、strtok()は空のトークンを無視し、私の記事Reading and Writing CSV Files in MFC

関連する問題