首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++比较和替换字符串的最后一个字符

C++比较和替换字符串的最后一个字符
EN

Stack Overflow用户
提问于 2016-03-08 04:22:36
回答 1查看 2.9K关注 0票数 2

我想检查以下几点:

  1. 如果最后一个添加到stringstream的字符是逗号。
  2. 如果是移除的话。
代码语言:javascript
复制
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<< "]";

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

代码语言:javascript
复制
if (str.str().substr(str.str().length() - 1) == ",")
{
    str.seekp(-1, rteStr.cur);
}

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

关于循环:

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

代码语言:javascript
复制
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" << ","
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-08 04:43:20

我处理这些循环的方式通常如下所示:在项目列表之间放置类似空格或逗号的内容:

代码语言:javascript
复制
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
    }
}

输出:

代码语言:javascript
复制
0, 1, 2, 3, 4

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

代码语言:javascript
复制
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
}

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

代码语言:javascript
复制
    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
    }

和第二个(可能更节省时间)解决方案:

代码语言:javascript
复制
    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
    }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35858896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档