我试图在C ++中使用vector分割单个单词中的字符串。所以我想知道如果用户在字符串中的单词之间放置多个空格,如何忽略向量中的空格。
我该怎么做?
scnview
答案 0 :(得分:2)
四件事:
使用重载的>>
运算符将流中的输入读入astring时,它会自动在空白处分隔。即它读取"单词"。
存在一个使用字符串作为输入的输入流std::istringstream
。
您可以将迭代器与流一起使用,例如: std::istream_iterator
std::vector
有一个constructor接受一对迭代器。
这意味着您的代码可能只是
std::string line;
std::getline(std::cin, line);
std::istringstream istr(line);
std::vector<std::string> words(std::istream_iterator<std::string>(istr),
std::istream_iterator<std::string>());
在此之后,向量words
将包含所有&#34;单词&#34;从输入行。
您可以轻松打印&#34;字&#34;使用std::ostream_iterator
和std::copy
:
std::copy(begin(words), end(words),
std::ostream_iterator<std::string>(std::cout, "\n"));
答案 1 :(得分:1)
最简单的方法是使用std::istringstream
,如下所示:
std::string sentence;
std::getline(std::cin,sentence);
std::istringstream iss(sentence);
std::vector<std::string> my;
std::string word;
while(iss >> word) {
my.push_back(word);
}
任何空格都将被忽略并自动跳过。
答案 2 :(得分:1)
您可以使用跳过空格的std::istream_iterator直接创建矢量:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
int main() {
std::string str = "Hello World Lorem Ipsum The Quick Brown Fox";
std::istringstream iss(str);
std::vector<std::string> vec {std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>() };
for (const auto& el : vec) {
std::cout << el << '\n';
}
}
答案 3 :(得分:0)
这是一个将给定句子分成单词的函数。
#include <string>
#include <vector>
#include <sstream>
#include <utility>
std::vector<std::string> divideSentence(const std::string& sentence) {
std::stringstream stream(sentence);
std::vector<std::string> words;
std::string word;
while(stream >> word) {
words.push_back(std::move(word));
}
return words;
}
答案 4 :(得分:-1)
减少字符串中的double,triple等空格是一个又一次遇到的问题。我总是使用以下非常简单的算法:
伪代码:
while " " in string:
string.replace(" ", " ")
在while循环之后,你知道你的字符串只有一个空格,因为多个连续的空格被压缩成单个。
大多数语言允许您在字符串中搜索子字符串,并且大多数语言都能够运行string.replace()
,因此这是一个有用的技巧。