2016-10-30 14 views
3

文字列のトークンを取得するためにC++でstrtokを使用しようとしています。しかし、私は、5回実行すると、関数によって返されるトークンが正しくないことがわかります。誰かがpls、何が問題になる可能性が示唆できますか?Strtok in C++の異常動作

私が直面していますこの問題を再現する

サンプルコード:

#include<iostream> 
#include<vector> 
#include<cstring> 

using namespace std; 
#define DEBUG(x) cout<<x<<endl; 


void split(const string &s, const char* delim, vector<string> & v) 
{ 
     DEBUG("Input string to split:"<<s); 

     // to avoid modifying original string first duplicate the original string and return a char pointer then free the memory 
     char * dup = strdup(s.c_str()); 
     DEBUG("dup is:"<<dup); 
     int i=0; 
     char* token = strtok(dup,delim); 

     while(token != NULL) 
     { 
       DEBUG("token is:"<<string(token)); 
       v.push_back(string(token)); 
       // the call is treated as a subsequent calls to strtok: 
       // the function continues from where it left in previous invocation 
       token = strtok(NULL,delim); 
     } 
     free(dup); 
} 

int main() 
{ 
     string a ="MOVC R1,R1,#434"; 

     vector<string> tokens; 
     char delims[] = {' ',','}; 
     split(a,delims,tokens); 
     return 0; 
} 

出力例:あなたはセカンドランで作成したトークンを見ることができるように

[email protected]:~/Documents/practice$ ./a.out 
Input string to split:MOVC R1,R1,#434 
dup is:MOVC R1,R1,#434 
token is:MOVC 
token is:R1 
token is:R1 
token is:#434 

[email protected]:~/Documents/practice$ ./a.out 
Input string to split:MOVC R1,R1,#434 
dup is:MOVC R1,R1,#434 
token is:MO 
token is:C 
token is:R1 
token is:R1 
token is:#434 

MO C R1 R1 #434なくMOVC R1 R1 #434

Iですライブラリコードもチェックしましたが、間違いを理解することはできませんでした。助けてください。

EDIT1:私のgccのバージョンである:gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)

+2

'strtok()'は、あなたが選ぶことのできる最悪の技術の1つです。 –

+0

他の方法をお勧めしますか?私は複数の区切り文字を使用して文字列を分割したい。また、私はブーストライブラリを使用したくありません。 –

+1

ここにいくつかの方向があります:http://stackoverflow.com/questions/24504582/how-to-test-whether-stringstream-operator-has-parsed-a-bad-type-and-skip-it –

答えて

8
char delims[] = {' ',','}; 

char delims[] = " ,"; 

する必要がありますが、予期しないため、代わりに使用する区切り文字のリストを保有するchar *の文字のリストを渡していますstrtokは0で終了する文字列が必要であるためです。あなたのケースでは、strtokは "森の中"に行き、宣言された配列の後ろのものをトークン化します。

関連する問題