2017-01-01 104 views
0

複数の行を含む文字列からトークンとしてデータを読み取ろうとしています。 私はコードstrtokは改行をどのように扱いますか?

char * pch; 
    pch = strtok ((char*)MyStr.c_str()," ,|,\n"); int i = 0; 
    while (pch != NULL && i++ < 10) 
    { 
     cerr << i << ':' << pch << ' '; 
     pch = strtok (NULL, " ,.-"); 
    } 

入力が

std::string SP1271 = "1271,1\n" 
"0,44248,8,45040,20,1,0,100\n" 
"545,590,603,564,566,598,569,585,586,578\n"; 

で、出力は

1:1271 2:1 
0 3:44248 4:8 5:45040 6:20 7:1 8:0 9:100 
545 10:590 

あるを使用し、セパレータとして '\ n' を使用することは合法ですか?

+1

なぜC++の機能を使わないのでしょうか? – kabanus

+5

定数 'c_str()'の返り値に 'strtok'を使うのは良い考えではありません(強制非constキャスト、汚れたハック!!)。 _real_ C++では、区切り文字に基づいてテキストを分割する実際の方法を検討する必要があります。 –

+1

はい、セパレータとして '\ n'を使用することは合法です。それは他のどのようなキャラクターでもあります。ただし、最初の 'strtok'呼び出しでは' \ n'をセパレータとして渡しますが、後続呼び出しでは渡しません。だから、 '' 1 \ n0 ''は単一のトークンとして終わるのです。なぜなら、 '\ n'は何とか特別なものではなく、それをトークンのセパレータとして扱うからです。 –

答えて

1

strtok()を使用することは非常に悪い考えです。この機能によって、元の文字列が変更される可能性があります。変更されていない文字列はconstです。

また、これが機能したとしても、その後のループでトークン区切り記号として '\ n'を予期していませんでした。strtok()だから、すべてのトークン区切り文字列を整列させてください。コンパイルして確認していないのはなぜ

size_t pe; 
for (size_t pb=0; pe=MyStr.find_first_of(" ,-\n", pb); pb=pe+1) 
{ 
    cout << MyStr.substr(pb, (pe==string::npos ? pe:pe-pb))<< " "; 
    if (pe==string::npos) 
     break; 
}