我需要使用strok..i来标记化数学表达式。我已经做了一些事情,但我无法将分隔符转换为我的向量 当我运行我得到的代码 2x 4y 6 3 这个输出 我怎样才能在我的矢量中得到分隔符,我怎样才能得到这样的输出 2x + 4y ^ 6 - 3 我的代码
int main()
{
vector<string> finalVector;
char input[1024]="2x+4y^6-3";
char *token = strtok(input, "^+-/()/t");
while (token != NULL) {
finalVector.push_back(token);
token = strtok(NULL, "^+-/()/t");
}
for (int i = 0; i < finalVector.size(); i++)
cout << finalVector.at(i) << " ";
return 0;
}
答案 0 :(得分:3)
我知道你的问题是如何用strtok做的,但我的感觉是这最终会让你痛苦。我认为你至少应该考虑使用支持这一点的boost tokenizer。实际上,boost支持丢弃和保留分隔符的组合;保持分隔符存储为自己的标记:
// char_sep_example_2.cpp
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>
int main()
{
std::string str = ";;Hello|world||-foo--bar;yow;baz|";
typedef boost::tokenizer<boost::char_separator<char> >
tokenizer;
boost::char_separator<char> sep("-;", "|", boost::keep_empty_tokens);
tokenizer tokens(str, sep);
for (tokenizer::iterator tok_iter = tokens.begin();
tok_iter != tokens.end(); ++tok_iter)
std::cout << "<" << *tok_iter << "> ";
std::cout << "\n";
return 0;
}
The output is:
<> <> <Hello> <|> <world> <|> <> <|> <> <foo> <> <bar> <yow> <baz> <|> <>
这很容易做到你想要的。我的猜测是,这将为您节省大量时间。参考:http://www.boost.org/doc/libs/1_58_0/libs/tokenizer/char_separator.htm
答案 1 :(得分:1)
strtok
用空字符替换找到的分隔符。分隔符无法恢复。
如果您在第一次调用strtok
之前复制了字符串,则可以恢复分隔符:
char* to_strtok = strdup(input);
const char* delims = "^+-/()/t";
char* token;
for (token = strtok(to_strtok, delims);
token != 0;
token = strtok(0, delims))
{
char delim = input[token - to_strtok + strlen(token)];
if (delim != '\0')
{
printf ("token=\"%s\" delim='%c'\n", token, delim);
}
else
{
printf ("last token=\"%s\"n", token);
}
}