首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 移除字串標點符號的標準實作

     編輯:關於C++

需求說明

編寫程式從 std::string 物件中移除所有標點符號。輸入必須包含至少一個標點,輸出為移除後的字串;若無標點則報錯。

完整程式碼

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main() {
    string input, result;
    bool has_punct = false;

    cout << "請輸入一個字串: " << endl;
    getline(cin, input);

    for (string::size_type i = 0; i != input.size(); ++i) {
        char ch = input[i];
        if (ispunct(static_cast<unsigned char>(ch))) {
            has_punct = true;
        } else {
            result += ch;
        }
    }

    if (has_punct) {
        cout << "結果: " << endl << result << endl;
    } else {
        cerr << "錯誤: 字串中不包含任何標點符號!" << endl;
        return -1;
    }

    return 0;
}

關鍵點解析

  • ispunct:自 <cctype>,判斷字元是否為標點。注意需轉型為 unsigned char 避免負值導致未定義行為。
  • getline:讀取整行含空白的輸入。
  • 單次遍歷:同時檢測標點存在性並構建結果字串,時間複雜度 O(n)。
  • 錯誤處理:若無標點則輸出錯誤訊息至 cerr 並回傳非零值。

現代 C++ 寫法 (C++11 起)

#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>

int main() {
    std::string input;
    std::getline(std::cin, input);

    std::string result;
    result.reserve(input.size());

    bool has_punct = false;
    std::copy_if(input.begin(), input.end(), std::back_inserter(result),
        [&has_punct](unsigned char ch) {
            if (std::ispunct(ch)) { has_punct = true; return false; }
            return true;
        });

    if (!has_punct) {
        std::cerr << "字串中不包含標點符號!\n";
        return 1;
    }
    std::cout << "結果:\n" << result << '\n';
}

使用 copy_if + Lambda 更具表達力,且 reserve 避免多次重新分配。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved