在 C++ 中從字串中刪除標點符號

Jinku Hu 2023年10月12日 C++ C++ String
  1. 使用 std::erasestd::remove_if 函式從 C++ 中的字串中刪除標點符號
  2. 在 C++ 中使用自定義函式從字串中移除標點符號
  3. 在 C++ 中使用迭代方法從字串中刪除標點符號
在 C++ 中從字串中刪除標點符號

本文將介紹幾種在 C++ 中如何從字串中刪除標點符號的方法。

使用 std::erasestd::remove_if 函式從 C++ 中的字串中刪除標點符號

std::remove_if 是 STL 演算法庫的一部分,它可以刪除所有給定條件為 true 的元素。條件應返回範圍內每個元素的 bool 值。在這種情況下,我們通過 ispunct 函式來檢查標點符號。注意,std::remove_if 返回新值範圍的通過迭代器,因此我們將使用 erase 方法連結到它的呼叫,該方法生成已解析的字串。這個解決方案的工作原理與 erase-remove 習語相似。

#include <iostream>
#include <string>

using std::cin;
using std::cout;
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::cin;
using std::cout;
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::cin;
using std::cout;
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
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ String