如何从 std::string 中删除 +
How to remove + from 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());
我想创建一个比数字和小表达式更高级的计算器程序。我需要完成的首要任务之一是检查输入的表达式是否有效,其中我想确保括号有效。我从控制台得到一个 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());