在 C++ 中按空格分割字串

Jinku Hu 2023年10月12日 C++ C++ String
  1. 使用 std::string::findstd::string::substr 函式在 C++ 中按空格分割字串
  2. 使用 std::istringstreamstd::copy 在 C++ 中按空格分割字串
  3. 使用 std::getlineerase-remove 習慣用法在 C++ 中按空格分割字串
在 C++ 中按空格分割字串

本文將演示有關如何在 C++ 中使用空格分隔符分割字串的多種方法。

使用 std::string::findstd::string::substr 函式在 C++ 中按空格分割字串

findsubstrstd::string 內建函式,可用於通過字串值或單個字元指定的任何定界符來分割字串。find 函式使用一個 string 引數,並返回給定子字串開始的位置;否則,如果找不到,則返回 string::npos。因此,我們在 while 迴圈中進行迭代,直到 find 函式返回 npos 為止。同時,可以使用 substr 方法訪問分隔符之前的字串部分,在這種情況下,分隔符是單個空格字元,並儲存到 vector 中供以後使用。之後,我們呼叫 erase 函式刪除第一個序列,包括定界符,這時可能會進行新的迭代以重複操作。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::istringstream;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  string space_delimiter = " ";
  vector<string> words{};

  size_t pos = 0;
  while ((pos = text.find(space_delimiter)) != string::npos) {
    words.push_back(text.substr(0, pos));
    text.erase(0, pos + space_delimiter.length());
  }
  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

輸出:

Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Sed
laoreet
sem
leo,
in
posuere
orci

使用 std::istringstreamstd::copy 在 C++ 中按空格分割字串

另外,我們可以使用 istringstream 類重新實現程式碼,該類為基於 string 的流提供輸入/輸出操作。一旦我們使用需要拆分的字串值初始化了 istringstream 物件,就可以呼叫 std::copy 演算法,將每個以空格分隔的字串值輸出到 cout 流。請注意,此方法僅支援空格分隔符拆分,因為這是 istringstream 類的實現所提供的。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::istringstream;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  vector<string> words{};

  istringstream iss(text);
  copy(std::istream_iterator<string>(iss), std::istream_iterator<string>(),
       std::ostream_iterator<string>(cout, "\n"));

  return EXIT_SUCCESS;
}

使用 std::getlineerase-remove 習慣用法在 C++ 中按空格分割字串

先前解決方案的一個缺點是與解析的單詞一起儲存的標點符號。可以使用擦除刪除慣用語解決此問題,該慣用語實質上是給定範圍內的條件刪除操作。在這種情況下,我們對 std::getline 檢索到的每個單詞都呼叫此方法,以修剪其中的所有標點符號。注意,ispunct 函式物件作為第三個引數傳遞給 remove_if 演算法,以檢查標點符號。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::istringstream;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text =
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
      "Sed laoreet sem leo, in posuere orci elementum.";
  char space_char = ' ';
  vector<string> words{};

  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, space_char)) {
    word.erase(std::remove_if(word.begin(), word.end(), ispunct), word.end());
    words.push_back(word);
  }

  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

輸出:

Lorem
ipsum
dolor
sit
amet
consectetur
adipiscing
elit
Sed
laoreet
sem
leo
in
posuere
orci
elementum
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