我尝试创建此字符串解析器,但代码会发出意外结果。代码从std::getline()
接收输入,然后将其传递给函数。它将返回std::vector<std::string>
。然后出于测试目的,我尝试打印出来(使用std::cout
)来自矢量的每个值,它似乎不起作用。
我要做的是将两个双引号中的单词除外。
给出的输入:Hello -c -v "Hello World!" -exec -str "Hello" -ps
输出:
Hello -c -v Hello
World!
-exec -str Hello
-ps
预期结果:
Hello
-c
-v
Hello World!
-exec
-str
Hello
-ps
这是功能:
std::vector<std::string> split(std::string str) {
std::vector<std::string> internal;
std::size_t last_quote = -1;
std::string bin;
for (std::size_t i=0; i<str.length(); i++) {
if (str[i] == '"') {
if (last_quote == -1) last_quote = i;
else {
last_quote = -1;
internal.push_back(bin);
bin = "";
}
} else if (str[i] == ' ' && last_quote != -1) {
internal.push_back(bin);
bin = "";
} else {
bin.push_back(str[i]);
}
if (i == str.length()-1) internal.push_back(bin);
}
return internal;
}
有什么想法吗?
答案 0 :(得分:0)
这样可以正常工作,但是在最后一次双重配额之后添加空字符串
std::vector<std::string> split(std::string str)
{
std::vector<std::string> internal;
std::size_t last_quote = -1;
std::string bin;
for (std::size_t i = 0; i < str.length(); i++)
{
if (str[i] == '"')
{
if (last_quote == -1) last_quote = i;
else
{
last_quote = -1;
internal.push_back(bin);
bin = "";
}
}
else if (str[i] == ' ' && last_quote == -1)
{
internal.push_back(bin);
bin = "";
}
else
{
bin.push_back(str[i]);
}
if (i == str.length() - 1) internal.push_back(bin);
}
return internal;
}
您的示例字符串有输出:
Hello
-c
-v
Hello World!
-exec
-str
Hello
-ps