函数strtok中的分隔符序列
sequence of delimiters in function strtok
我试图在c++中获得函数strtok()
的令牌。是非常简单的,当你只使用一个分隔符:token = strtok(auxiliar,"[,]");
。这将在每次函数找到[
, ,
或]
时削减auxiliar
。
我想要的是获得带有一系列分隔符的令牌,如:[,]
有可能这样做与strtok
功能?我找不到路。
谢谢!
如果您希望strtok
将[,]
视为一个单个令牌,则不能这样做。strtok
总是将传入的任何分隔符字符串视为单独的1个字符的分隔符。
strtok
。它不是可重入的(例如,你不能嵌套调用),不是类型安全的,而且非常容易使用,从而产生讨厌的bug。
最简单的解决方案是在循环中简单地在std::string
中搜索所需的特定分隔符。如果您需要更复杂的功能,Boost库中有标记器,我还发布了仅使用标准库进行更全面标记化的代码,在这里。
我上面链接的代码也将分隔符视为单个字符,但我认为代码可以按您希望的方式扩展。
如果这真的是c++,你应该使用std::string而不是C字符串。
下面是一个仅使用STL将std::string
拆分为std::vector
的示例:
#include <cstddef>
#include <string>
#include <vector>
std::vector<std::string> split(std::string str, std::string sep) {
std::vector<std::string> vec;
size_t i = 0, j = 0;
do {
i = str.find(sep, j);
vec.push_back( str.substr(j, i-j) );
j = i + sep.size();
} while (i != str.npos);
return vec;
}
int main() {
std::vector<std::string> vec = split("This[,]is[[,]your, string", "[,]");
// vec is contains "This", "is[", "your, string"
return 0;
}
如果可以使用c++ 11的新特性,则可以使用regex和token迭代器。例如:
regex reg("[,]");
const sregex_token_iterator end;
string aux(auxilar);
for(sregex_token_iterator iter(aux.begin(), aux.end(), reg); iter != end; ++iter) {
cout << *iter << endl;
}
这个例子来自Wrox书籍Professional c++
如果你可以使用boost库,我认为这将做你想做的事情-不完全确定,虽然你的问题有点不清楚
#include <iostream>
#include <vector>
#include <string>
#include <boost/tokenizer.hpp>
int main(int argc, char *argv[])
{
std::string data("[this],[is],[some],[weird],[fields],[data],[I],[want],[to],[split]");
boost::tokenizer<boost::char_separator<char> > tokens(data, boost::char_separator<char>("],["));
std::vector<std::string> words(tokens.begin(), tokens.end());
for(std::vector<std::string>::const_iterator i=words.begin(),end=words.end(); i!=end; ++i)
{
std::cout << ''' << *i << "'n";
}
return 0;
}
这会产生以下输出
'this'
'is'
'some'
'weird'
'fields'
'data'
'I'
'want'
'to'
'split'
相关文章:
- 当用户键入分隔符时,停止getline()输入
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 如何在 c++ 中使用 ',' 作为 getline 分隔符
- 带有多个字符分隔符的正则表达式
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 字符串开头的分隔符
- 尝试将 c 字符串数组与分隔符连接起来
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 根据新的行分隔符从字符串中删除子字符串
- 如何在 c 中使用 2 个 strtok?
- 同一分隔符之间的多个子字符串
- 通过分隔符分隔包含 UTF-16 BE 文本的uint8_t数组
- 难以理解 strtok()
- 将 strtok 分隔符设置为两个字符
- strtok 使用了错误的分隔符(空格和",")
- Strtok 如何也包含分隔符作为令牌
- 我对如何在 c++ 中使用 getline 和 strtok 解析多个分隔符感到非常困惑
- C++ strtok 跳过第二个标记或连续分隔符
- 将字符串分隔为分隔符strtok (c++)
- 函数strtok中的分隔符序列