在 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