在 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