在 C++ 中从字符串中删除标点符号
-
使用
std::erase
和std::remove_if
函数从 C++ 中的字符串中删除标点符号 - 在 C++ 中使用自定义函数从字符串中移除标点符号
- 在 C++ 中使用迭代方法从字符串中删除标点符号
本文将介绍几种在 C++ 中如何从字符串中删除标点符号的方法。
使用 std::erase
和 std::remove_if
函数从 C++ 中的字符串中删除标点符号
std::remove_if
是 STL 算法库的一部分,它可以删除所有给定条件为 true
的元素。条件应返回范围内每个元素的 bool
值。在这种情况下,我们通过 ispunct
函数来检查标点符号。注意,std::remove_if
返回新值范围的通过迭代器,因此我们将使用 erase
方法链接到它的调用,该方法生成已解析的字符串。这个解决方案的工作原理与 erase-remove
习语相似。
#include <iostream>
#include <iostream>
#include <string>
using std::cout; using std::cin;
using std::endl; using std::string;
int main(){
string text = "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.";
cout << text << endl;
text.erase(std::remove_if(text.begin(), text.end(), ispunct), text.end());
cout << text << endl;
return EXIT_SUCCESS;
}
输出:
Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor
在 C++ 中使用自定义函数从字符串中移除标点符号
或者,可以将先前的方法移至单独的函数,创建给定字符串的本地副本并对其进行操作,同时将解析后的值返回给调用者代码。该功能可用于扩展功能以支持不同的字符组,甚至可以为 remove_if
算法的第三个参数传递自定义谓词功能。
#include <iostream>
#include <string>
using std::cout; using std::cin;
using std::endl; using std::string;
string removeSpaces(const string& s) {
string tmp(s);
tmp.erase(std::remove_if(tmp.begin(), tmp.end(), ispunct), tmp.end());
return tmp;
}
int main(){
string text = "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.";
cout << text << endl;
string parsed_text = removeSpaces(text);
cout << parsed_text << endl;
return EXIT_SUCCESS;
}
输出:
Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor
在 C++ 中使用迭代方法从字符串中删除标点符号
另一种选择是实现一个单独的函数,该函数遍历字符串的每个字符。该函数通过引用获取字符串,并利用 for
循环遍历该字符串。在每次迭代中,都会调用 ispunct
来检查字符是否为标点符号。请注意,在每个匹配条件下,都会为 len
变量分配字符串的大小,因为原始字符串对象已被 erase
函数修改,并且循环需要更新计数。
#include <iostream>
#include <string>
using std::cout; using std::cin;
using std::endl; using std::string;
void removeSpaces2(string& s) {
for (int i = 0, len = s.size(); i < len; i++)
{
if (ispunct(s[i])) {
s.erase(i--, 1);
len = s.size();
}
}
}
int main(){
string text = "Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.";
cout << text << endl;
removeSpaces2(text);
cout << text << endl;
return EXIT_SUCCESS;
}
输出:
Lorem ipsum, dolor sit! amet, consectetur? adipiscing elit. Ut porttitor.
Lorem ipsum dolor sit amet consectetur adipiscing elit Ut porttitor
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn