2017-10-28 17 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

文字列内の2重、3重などのスペースを減らすことは何度も繰り返し発生する問題です。あなたが複数の連続した空間がシングルに圧縮されたので、あなたの文字列は単一のスペースを持って知って、whileループの後

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

擬似コード:私は常に次の非常に単純なアルゴリズムを使用しました。

ほとんどの言語では、文字列内の部分文字列を検索できます。ほとんどの言語では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'; 
    } 
} 
関連する問題