忽略向量中的空格C++
问题描述:
我试图在C++中使用向量在单个单词中分割字符串。所以我想知道如何忽略向量中的空格,如果用户在字符串中的单词之间放置多个空格。忽略向量中的空格C++
我该怎么做?
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
cout<<"Sentence: ";
string sentence;
getline(cin,sentence);
vector<string> my;
int start=0;
unsigned int end=sentence.size();
unsigned int temp=0;
while(temp<end){
int te=sentence.find(" ",start);
temp=te;
my.push_back(sentence.substr(start, temp-start));
start=temp+1;
}
unsigned int i;
for(i=0 ; i<my.size() ; i++){
cout<<my[i]<<endl;
}
return 0;
}
答
最简单的方法是使用一个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);
}
任何空格将被忽略,自动跳过。
答
四件事情:
当使用重载
>>
操作者从一个流中读取输入到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
将包含所有的从输入行“字”。
您可以轻松打印“改为”使用std::ostream_iterator
和std::copy
:
std::copy(begin(words), end(words),
std::ostream_iterator<std::string>(std::cout, "\n"));
答
这里是分割给句成词的功能。
#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;
}
答
减少字符串中的双重,三重等空格是一个你会一次又一次遇到的问题。我一直用下面的非常简单的算法:
伪代码:
while " " in string:
string.replace(" ", " ")
while循环之后,你知道你的字符串只有一个空格,因为多个连续的空格被压缩单打。
大多数语言都允许您搜索字符串中的子字符串,并且大多数语言都可以运行string.replace()
,因此这是一个有用的技巧。
答
您可以创建直接使用它跳过空格的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';
}
}
也许用'的std :: regex'甚至更好'的std :: stringstream'。 – Ron
为什么不简单地使用'cin >> string'并迭代? –
我会正确缩进代码,以便帮助人们更清晰。 – s5s