C ++比较并替换stringstream的最后一个字符

问题描述 投票:1回答:1

我想查看以下内容:

  1. 如果附加到stringstream的最后一个字符是逗号。
  2. 如果它是删除它。

std::stringstream str;
str << "["
//loop which adds several strings separated by commas

str.seekp(-1, str.cur); // this is to remove the last comma before closing bracket

str<< "]";

问题是如果循环中没有添加任何内容,则从字符串中删除左括号。所以我需要一种方法来检查最后一个字符是否是逗号。我是这样做的:

if (str.str().substr(str.str().length() - 1) == ",")
{
    str.seekp(-1, rteStr.cur);
}

但我对此感觉不太好。有一个更好的方法吗?

关于循环:

循环用于标记通过套接字接收的一组命令,并将其格式化以通过另一个套接字发送到另一个程序。每个命令都以OVER标志结束。

std::regex tok_pat("[^\\[\\\",\\]]+");
std::sregex_token_iterator tok_it(command.begin(), command.end(), tok_pat);
std::sregex_token_iterator tok_end;
std::string baseStr = tok_end == ++tok_it ? "" : std::string(*tok_it);
while (baseStr == "OVER")
{
    //extract command parameters
    str << "extracted_parameters" << ","
}
c++ regex stringstream
1个回答
4
投票

我经常处理这些循环的方式,你想在项目列表之间放置空格或逗号之类的东西是这样的:

int main()
{
    // initially the separator is empty
    auto sep = "";

    for(int i = 0; i < 5; ++i)
    {
        std::cout << sep << i;
        sep = ", "; // make the separator a comma after first item
    }
}

输出:

0, 1, 2, 3, 4

如果你想提高它的速度效率,你可以在进入循环之前使用if()输出第一个项目,输出其余项目,如下所示:

int main()
{
    int n;

    std::cin >> n;

    int i = 0;

    if(i < n) // check for no output
        std::cout << i;

    for(++i; i < n; ++i) // rest of the output (if any)
        std::cout << ", " << i; // separate these
}

在您的情况下,第一个解决方案可以像这样工作:

    std::regex tok_pat("[^\\[\\\",\\]]+");
    std::sregex_token_iterator tok_it(command.begin(), command.end(), tok_pat);
    std::sregex_token_iterator tok_end;
    std::string baseStr = tok_end == ++tok_it ? "" : std::string(*tok_it);

    auto sep = ""; // empty separator for first item

    while (baseStr == "OVER")
    {
        // extract command parameters
        str << sep << "extracted_parameters";
        sep = ","; // make it a comma after first item
    }

第二个(可能更有效的时间)解决方案:

    std::regex tok_pat("[^\\[\\\",\\]]+");
    std::sregex_token_iterator tok_it(command.begin(), command.end(), tok_pat);
    std::sregex_token_iterator tok_end;
    std::string baseStr = tok_end == ++tok_it ? "" : std::string(*tok_it);

    if (baseStr == "OVER")
    {
        // extract command parameters
        str << "extracted_parameters";
    }

    while (baseStr == "OVER")
    {
        // extract command parameters
        str << "," << "extracted_parameters"; // add a comma after first item
    }
© www.soinside.com 2019 - 2024. All rights reserved.