C++ 标记 std 字符串
c++ tokenize std string
可能的重复项:
如何在C++中标记字符串?
您好,我想知道如何使用 strtok 标记 std 字符串
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*)’
我正在寻找一种快速简便的方法,因为我认为这不需要太多时间
我总是使用getline
来完成此类任务。
istringstream is(line);
string part;
while (getline(is, part, ','))
cout << part << endl;
std::string::size_type pos = line.find_first_of(',');
std::string token = line.substr(0, pos);
要查找下一个令牌,请重复find_first_of
但从 pos + 1
开始。
您可以通过执行&*line.begin()
来获取指向char
缓冲区的非常量指针来使用strtok
。我通常更喜欢使用boost::algorithm::split
,尽管在C++中。
strtok
是一个相当古怪、邪恶的函数,它修改了它的参数。这意味着你不能直接在std::string
的内容上使用它,因为没有办法从该类中获取指向可变的、以零结尾的字符数组的指针。
您可以处理字符串数据的副本:
std::vector<char> buffer(line.c_str(), line.c_str()+line.size()+1);
char * pch = strtok(&buffer[0], ",");
或者,对于更C++的成语,您可以使用字符串流:
std::stringstream ss(line);
std::string token;
std::readline(ss, token, ',');
或者更直接地找到逗号:
std::string token(line, 0, line.find(','));
相关文章:
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 使用std::mt19937从字符串中返回一个随机单词
- 我可以重新分配/覆盖std::字符串吗
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何将这个std::字符串转换为std::基本字符串
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- std::字符串与 PCWSTR 的对话
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 使用 std::string_view 的子字符串控制台输出
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 重载 std::字符串运算符+ 用于打印枚举名称
- 从std::字符串创建OssBitString
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- C 中的特殊字符的子字符串(STD :: substr)
- 是否建议将字符串std::移动到将被覆盖的容器中
- 显式指定要写入的字符串 std::ostringstream
- 如何将uint16_t转换为宽字符串(std::wstring)
- 读取和Huffman压缩4字节二进制字符串STD C++Linux环境