使用 find() 将一行拆分为标记
Splitting a line into token with find()
我想拆分这条线:
cmd1; cmd2; cmd3
进3串我会进货成一个清单。喜欢
cmd1
cmd2
cmd3
所以我编写了这段代码:
main.cpp
#include <string>
#include <iostream>
#include <list>
int main()
{
std::string line("cmd1; cmd2; cmd3");
std::list<std::string> l;
size_t pos = 0;
size_t ex_pos = 0;
while ((pos = line.find(';', ex_pos)) != std::string::npos)
{
l.push_back(line.substr(ex_pos, pos));
ex_pos = pos + 2;
}
l.push_back(line.substr(ex_pos, pos));
for (std::list<std::string>::iterator it = l.begin(); it != l.end(); ++it)
{
std::cout << *it << std::endl;
}
return (0);
}
但我不知道为什么 returns 我 :
cmd1
cmd2; cmd3
cmd3
std::basic_string::substr的第二个参数需要一个长度,表示从start_pos开始的子串的长度。
string substr (size_t pos = 0, size_t len = npos) const;
所以,你实际上应该替换
l.push_back(line.substr(ex_pos, pos));
与
l.push_back(line.substr(ex_pos, pos - ex_pos));
substr
的第二个参数不是要复制的 lat 字符的索引。它是目标子串的长度。
l.push_back(line.substr(ex_pos, pos-ex_pos));
我想拆分这条线:
cmd1; cmd2; cmd3
进3串我会进货成一个清单。喜欢
cmd1
cmd2
cmd3
所以我编写了这段代码:
main.cpp
#include <string>
#include <iostream>
#include <list>
int main()
{
std::string line("cmd1; cmd2; cmd3");
std::list<std::string> l;
size_t pos = 0;
size_t ex_pos = 0;
while ((pos = line.find(';', ex_pos)) != std::string::npos)
{
l.push_back(line.substr(ex_pos, pos));
ex_pos = pos + 2;
}
l.push_back(line.substr(ex_pos, pos));
for (std::list<std::string>::iterator it = l.begin(); it != l.end(); ++it)
{
std::cout << *it << std::endl;
}
return (0);
}
但我不知道为什么 returns 我 :
cmd1
cmd2; cmd3
cmd3
std::basic_string::substr的第二个参数需要一个长度,表示从start_pos开始的子串的长度。
string substr (size_t pos = 0, size_t len = npos) const;
所以,你实际上应该替换
l.push_back(line.substr(ex_pos, pos));
与
l.push_back(line.substr(ex_pos, pos - ex_pos));
substr
的第二个参数不是要复制的 lat 字符的索引。它是目标子串的长度。
l.push_back(line.substr(ex_pos, pos-ex_pos));