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)
'strtok()'は、あなたが選ぶことのできる最悪の技術の1つです。 –
他の方法をお勧めしますか?私は複数の区切り文字を使用して文字列を分割したい。また、私はブーストライブラリを使用したくありません。 –
ここにいくつかの方向があります:http://stackoverflow.com/questions/24504582/how-to-test-whether-stringstream-operator-has-parsed-a-bad-type-and-skip-it –