如何解决如何从 std::string 中删除 +
我想创建一个比数字和小表达式更高级的计算器程序。我需要完成的首要任务之一是检查输入的表达式是否有效,在此我想确保括号有效。我从控制台得到一个 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: ((+)[+])
大部分是成功的,但我不知道为什么 + 符号仍然存在。
我知道还有许多其他方法可以完成此操作,例如如果我看到所需的字符之一来获取括号、大括号等,则附加到另一个字符串,但我仍然很好奇为什么 + 符号仍然存在。
解决方法
在您的循环中,当您到达要删除的字符时,您不会修改索引 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());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。