c++ 字符串::删除括号和括号内的字符

yks3o0rb  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(332)

这是我的第一个问题,如果我这样做违反了任何规则,我很抱歉。无论如何,我的问题是关于字符串的。我如何删除括号以及字符串中的文本?例如..我有一个字符串“示例(stuff)example”。我希望每次都能去掉括号和里面的字符,是不是这样“(stuff)示例示例”或此“示例示例(东西)"。我也是c++的新手,正在使用replit作为我的ide,它不包含自动填充feautre,所以我不知道我使用的是什么函数,使这项任务变得困难。如果您还可以为我指出关于std::方法的方向,请让我知道。
我真的是新的编程,通常得到帮助时,编写代码,现在做独立的工作,而从大学休息。

#include <string>

std::string remove_parentheses(const std::string &str) {
    int i = 0;
    while(i < str.length()) {
        if(str[i] == '(' || str[i] == ')' ) {
            str.erase(i,1);
        } else{i++} 
    }
    return str; // your code here
}

int main() {
    std::string str = "Computer systems";
    remove_parentheses(str);
    return 0;
}

上面写着..
错误:没有匹配的成员函数调用'erase' str.erase(i,1);
输入“计算机(计算机系统)系统”
输出“计算机系统”
这不是正确的擦除方法吗?我找不到字符串或std::的函数列表函数.谢谢你的帮助!

ozxc1zmp

ozxc1zmp1#

你不能从const引用中删除内容。const修饰符是专门设计来禁止你修改引用对象的。如果你想在原处修改它,取一个非常数引用。

void remove_parentheses(std::string &str)

如果你想创建一个新的字符串,并且修改不受影响,那么就按值获取字符串(当你调用函数时会产生一个副本),然后返回新的字符串。

std::string remove_parentheses(std::string str)
vs3odd8k

vs3odd8k2#

Silvio Mayolo答案的补充,但我强烈建议输出一个新的字符串,而不是在原处修改现有的字符串。我们可以使用一个变量来跟踪嵌套括号的级别,使用一个std::ostringstream来高效地构建一个新的字符串,去掉括号及其内容。

std::string remove_parentheses(const std::string &str) {
    int paren_level = 0;
    std::ostringstream ss;

    for (auto ch : str) {
        if (ch == '(') {
            paren_level++;
        }
        else if (ch == ')' && paren_level > 0) {
            paren_level--;
        }
        else if (paren_level == 0) {
            ss << ch;
        }
    }

    return ss.str();
}

从rturrado的回答中得到一些启发,但跳过C20,依靠C17的特性,这可以用于使用std::copy_if

std::string remove_parentheses(const std::string &str) {
    int paren_level = 0;
    std::string s;
    s.reserve(str.length());

    std::copy_if(str.cbegin(), str.cend(),
        std::back_inserter(s),
        [&paren_level](auto ch) {
            if (ch == '(') {
               paren_level++;
               return false;
            }
            else if (ch == ')' && paren_level > 0) {
               paren_level--;
               return false;
            }
            else if (paren_level == 0) {
               return true;
            }
        });

    return s;
}
a7qyws3x

a7qyws3x3#

你也可以开始习惯STL算法。从C++20开始,你可以使用std::string::erase_if,它基本上会:

  • 遍历字符串的每个字符,并擦除满足条件的字符(修改后的字符串的大小将相应更新)。
  • 条件为:我已经找到了一个闭括号,或者我有一个开括号还没有闭,正如在“Chris的回答”中所解释的那样。
  • 我们可以处理输入字符串的副本,然后返回该副本。

Demo(https://godbolt.org/z/Gzzqr7778)

#include <iostream>  // cout
#include <string>

std::string remove_parentheses(std::string str) {
    int no_of_open_parens{ 0 };
    std::erase_if(str,
        [&no_of_open_parens](char c) {
            if (c == '(') {
                no_of_open_parens++;
            } else if (c == ')' and no_of_open_parens > 0) {
                no_of_open_parens--;
            }
            return c == ')' or no_of_open_parens > 0;
        }
    );
    return str;
}

int main() {
    std::string in_str = "Computer (computer systems) systems";
    auto out_str = remove_parentheses(in_str);
    std::cout << out_str << "\n";
}

// Outputs: Computer  systems

相关问题