在 C++ 中按空格分割字串
Jinku Hu
2023年10月12日
C++
C++ String
-
使用
std::string::find
和std::string::substr
函式在 C++ 中按空格分割字串 -
使用
std::istringstream
和std::copy
在 C++ 中按空格分割字串 -
使用
std::getline
和erase-remove
習慣用法在 C++ 中按空格分割字串

本文將演示有關如何在 C++ 中使用空格分隔符分割字串的多種方法。
使用 std::string::find
和 std::string::substr
函式在 C++ 中按空格分割字串
find
和 substr
是 std::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::istringstream
和 std::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::getline
和 erase-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