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

Jinku Hu 2023年10月12日
  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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

LinkedIn Facebook

相關文章 - C++ String