我试图创建一个简单的字符串解析器,但我的代码不起作用

时间:2016-03-13 12:56:38

标签: c++ parsing

我尝试创建此字符串解析器,但代码会发出意外结果。代码从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;
}

有什么想法吗?

1 个答案:

答案 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