7

重複の可能性:
C++ で文字列をトークン化するにはどうすればよいですか?

こんにちは、std 文字列を strtok でトークン化する方法を考えていました

string line = "hello, world, bye";    
char * pch = strtok(line.c_str(),",");

次のエラーが表示されます

error: invalid conversion from ‘const char*’ to ‘char*’
error: initializing argument 1 of ‘char* strtok(char*, const char*)’

あまり時間がかからないと思うので、これに対する迅速で簡単なアプローチを探しています

4

4 に答える 4

16

私はいつもgetlineそのようなタスクに使用します。

istringstream is(line);
string part;
while (getline(is, part, ','))
  cout << part << endl;
于 2012-09-27T17:54:52.987 に答える
11
std::string::size_type pos = line.find_first_of(',');
std::string token = line.substr(0, pos);

次のトークンを見つけるには、繰り返しますfind_first_ofが、 から始めpos + 1ます。

于 2012-09-27T17:52:44.417 に答える
3

バッファへの非 const ポインタを取得するためにstrtok使用できます。私は通常、C++で使用することを好みます。&*line.begin()charboost::algorithm::split

于 2012-09-27T17:54:12.327 に答える
1

strtok引数を変更する、かなり風変わりで邪悪な関数です。std::stringこれは、そのクラスから変更可能なゼロ終了文字配列へのポインターを取得する方法がないため、a の内容で直接使用できないことを意味します。

文字列のデータのコピーで作業できます。

std::vector<char> buffer(line.c_str(), line.c_str()+line.size()+1);
char * pch = strtok(&buffer[0], ",");

または、より多くの C++ イディオムについては、string-stream を使用できます。

std::stringstream ss(line);
std::string token;
std::readline(ss, token, ',');

または、コンマをより直接的に見つけます:

std::string token(line, 0, line.find(','));
于 2012-09-27T17:54:28.270 に答える