2017-03-10 12 views
-3

私はgetlineから標準入力から入力を読み込んでいますが、私はgetlineから受け取った行の各単語を調べることに興味があります。getlineからの解析結果

これを達成する最適なソリューションは何ですか?私は文字列をstringstreamに入れ、それを解析することを考えていましたが、より効果的な解決法があるのか​​、これがうまくいくのか疑問に思っていました。

何か提案がありがとうございます。

+5

あなたはそれぞれの単語を読んで興味を持っている場合は、なぜあなたが最初の場所で行を取得するのでしょうか?ちょうどシンプルなシン>>文字列、それはスペースまで読むでしょう...。構文解析の必要はありません。 –

+0

各行には一緒に行くコマンドのセットが含まれているので、私は全体の行を取得する必要があります。各行はセットとは別にする必要があります。目標は、C++を使用してSQLスタイルのコマンドを実装することです – umalexans

+0

最良の方法は、例を投稿することです。実際に行を読み込んで解析する場合は、getlineを使うと文字列に行を格納します。そこからスペースを調べて各単語を読み、必要なものを単語で実行するループを使用できます。 –

答えて

-2

string.c_str()[index] 'を使用すると、string内の各単語を取得できます。

#include <iostream> 
using namespace std; 
int main(void) 
{ 
    string sIn; 

    // input 
    getline(cin,sIn); 

    for (int i=0 ; i<sIn.length() ; i++) { 
     // get one char from sIn each time 
     char c = sIn.c_str()[i]; 

     // insert something you want to do 
     // ... 

     cout << c << endl; 
    } 
    return 0; 
} 
+0

文字列の各単語を取得してcharに格納しますか?意味がありません。 –

0

ブーストライブラリを使用することができれば、文字列アルゴリズムの中には、行を単語にトークン化するのに便利なものがあります。

#include <iostream> 
#include <string> 
#include <vector> 
#include <boost/algorithm/string/split.hpp> 
#include <boost/algorithm/string/trim.hpp> 

std::vector<std::string> split(std::string value, 
           const std::string& delims) { 
    std::vector<std::string> parts; 
    boost::trim_if(value, boost::is_any_of(delims)); 
    boost::split(parts, value, 
       boost::is_any_of(delims), boost::token_compress_on); 
    return parts; 
} 

int main(int, char**) { 
    for (size_t lines = 1; !std::cin.eof(); ++lines) { 
     std::string input_line; 
     std::getline(std::cin, input_line); 
     std::vector<std::string> words = split(input_line, " "); 
     for (const std::string& word : words) { 
      std::cout << "LINE " << lines << ": " << word << std::endl; 
     } 
    } 
} 

出力例:

$ printf "test foo bar\n a b c \na b c" | ./a.out 
LINE 1: test 
LINE 1: foo 
LINE 1: bar 
LINE 2: a 
LINE 2: b 
LINE 2: c 
LINE 3: a 
LINE 3: b 
LINE 3: c