在 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