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

Jinku Hu 2023年1月30日 2021年4月29日
  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 <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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

相關文章 - C++ String