如何从 std::string 中删除 +

Posted

技术标签:

【中文标题】如何从 std::string 中删除 +【英文标题】:How to remove + from std::string 【发布时间】:2021-04-02 17:58:43 【问题描述】:

我想创建一个比数字和小表达式更高级的计算器程序。我需要完成的首要任务之一是检查输入的表达式是否有效,在此我想确保括号有效。我从控制台得到一个 std::string 并且我想将表达式简化为以下内容:(, ), [, ], , 。

bool in (char elem, std::vector<char> V) 
    for (char c : V) 
        if (c == elem) 
            return true;
        
    
    return false;


void valid_parentheses(std::string s) 
    // first remove the spaces
    s.erase(std::remove_if(s.begin(), s.end(), isspace), s.end());
    std::vector<char> valid =  '(', '[', '', ')', ']', '' ;

    for (long unsigned int c = 0; c < s.size(); c++) 
        if (!in(s[c], valid) 
            s.erase(s.begin() + c);
        
    
    std::cout << "New string: " << s << std::endl;

如果我用输入调用它: ( ( 1 + 5 ) * [ 3 + 4 ] )

$ g++ main.cpp -o output && ./output
( ( 1 + 5 ) * [ 3 + 4 ] )

我得到了输出

New string: ((+)[+])

这大多是成功的,但我不知道为什么 + 符号仍然存在。

我知道还有许多其他方法可以完成此操作,例如,如果我看到所需的字符之一来获取括号、大括号等,则附加到另一个字符串,但我仍然很好奇为什么 + 符号仍然存在。

【问题讨论】:

in的定义是什么?请发minimal reproducible example 问题不是真正的 + 是吗?任何 3+ 符号组合不会导致这种情况吗? IE。甚至是“123”。因为您没有调整删除符号时用于迭代的整数索引c @PeterT,你是对的,但我不确定你调整整数索引是什么意思以及我应该将其调整为什么 我真的认为事先验证括号没有什么意义:虽然它可以确保括号本身是平衡的,但它不会告诉你括号在完整表达式中是否处于合法位置。考虑表达式(1+) @G.Sliepen,我试图采取一种简单的方法,分部分执行这些步骤,因此:检查括号是否有效,如果有效,请处理其他事情。 【参考方案1】:

在您的循环中,当您到达要删除的字符时,您不会修改索引c。这意味着您跳过被擦除字符之后的每个字符。一个简单的解决方法是在擦除时减少 c

if (!in(s[c], valid) 
    s.erase(s.begin() + c);
    c--; // here  

当然,您应该只使用一种算法,就像您删除空格一样:

s.erase(std::remove_if(s.begin(), s.end(), [&](auto c)
    return !in(c, valid);
), s.end());

【讨论】:

以上是关于如何从 std::string 中删除 +的主要内容,如果未能解决你的问题,请参考以下文章

使用擦除从“(”到“)”中删除 std::string 中的字符?

C ++从多行字符串中删除新行

从库中删除文件后如何从 Xcode 中删除引用?

如何从 git bash 屏幕中删除文件并从存储库中删除该文件? [复制]

如何从 PHAssetCollection 中删除图像?

如何从游标中获取、删除、提交