2017-10-28 86 views
0

我试图在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; 
} 
+2

也许用'的std :: regex'甚至更好'的std :: stringstream'。 – Ron

+0

为什么不简单地使用'cin >> string'并迭代? –

+1

我会正确缩进代码,以便帮助人们更清晰。 – s5s

回答

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. 当使用重载>>操作者从一个流中读取输入到ASTRING,然后它自动分离在白色空间。即它读取“文字”。

  2. 存在使用字符串作为输入的输入流std::istringstream

  3. 您可以对流使用迭代器,例如, std::istream_iterator

  4. 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_iteratorstd::copy

std::copy(begin(words), end(words), 
      std::ostream_iterator<std::string>(std::cout, "\n")); 
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; 
} 
-1

减少字符串中的双重,三重等空格是一个你会一次又一次遇到的问题。我一直用下面的非常简单的算法:

伪代码:

while " " in string: 
    string.replace(" ", " ") 

while循环之后,你知道你的字符串只有一个空格,因为多个连续的空格被压缩单打。

大多数语言都允许您搜索字符串中的子字符串,并且大多数语言都可以运行string.replace(),因此这是一个有用的技巧。

+0

问题是如何在C++中这样做,所以用不同的语言或伪代码发布解决方案似乎不是一种解决方案。此外,'std :: string :: replace'不能这样工作,所以代码缺少一些重要的细节,比如使用'find'。此外,虽然这个技巧的作品,它表现不佳。 – navyblue

+0

他的问题是“所以我想知道如何忽略向量中的空格,如果用户在字符串中的单词之间放置多个空格”。这就是我以最简单和最短的方式回答的问题。关于表现的评论是无关紧要的。 – s5s

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'; 
    } 
}