2011-10-25 12 views
1

これは私の最初のC++プログラムです。これは、入力内の単語の数を表示します。このプログラムの仕組み

私の最初の質問は、どのようにループに入りカウントに追加されますか?私はスペース文字を入力するたびにそれですか?もしそうなら、私は単語を数えようとしているのをどのように知っていますか?

using namespace std; 

int main() { 
    int count; 
    string s; 
    count = 0; 
    while (cin >> s) 
     count++; 
    cout << count << '\n'; 
    return 0; 
} 

私の2番目の質問です。誰かが私の名前空間stdがbegineerのために意味するものを私に説明することはできますか?

答えて

2
  1. Cinがはい、スペースまでの入力をキャプチャします。あなたが持っているループの特定のスタイルは、ファイルの終わり(EOF)が見つかるか、入力が悪くなるまで続きます。そのループは、私にとっては一般的なC++の練習のようには見えませんが、hereと書かれています。

2. namespace stdは、コード内で参照しているオブジェクトを検索する場所をコンパイラに指示する方法です。異なるオブジェクトは異なる名前空間の中にあるため、コンパイラに(std :: cinとも呼ばれる)具体的に指示するか、使用するオブジェクトが将来どこになるかを便利に指示する必要があります(using namespace std)。

+0

私はそれが実際に2つの一般的な方法を見つける。 1つは彼が示しているように、もう1つはEOFや他のエラーに早く遭遇すると悲惨に失敗します。 –

7

シン>>文字列を入力すると、あなたは単語を読んで文字列に入れます。はい、区切り文字に達するまでcharでcharを読み込みます。

標準は標準を意味します。標準C++ライブラリはstdネームスペースの内部にあります。あなたは、std名前空間を使用してずに書き換えるまたはコードすることができます

int main() { 
    int count; 
    std::string s; 
    count = 0; 
    while (std::cin >> s) 
     count++; 
    std::cout << count << '\n'; 
    return 0; 
} 

私は初心者は何が起こっているかを理解することは困難であるため、は、名前空間stdステートメントを使用して使用することを思いとどまら。

+0

これは 'set'ですが残念なことによく使われる名前です。 –

2

コードでは、cin >> sは入力ストリームからstd::stringを読み込もうとします。試行が成功すると、戻り値cin >> sは暗黙的にtrueに変換され、whileループは継続してカウンタをインクリメントします。それ以外の場合は、入力ストリームから読み取るデータがなくなるため、試行が失敗するとwhileループが終了します。以下に示すようにあなたは、単語をカウントするstd::distanceを使用することができます

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <string> 

int main() { 
     std::istream_iterator<std::string> begin(std::cin), end; 
     size_t count = std::distance(begin, end); 
     std::cout << count << std::endl;   
     return 0; 
} 

デモ:このコードでhttp://www.ideone.com/Hldz3

を、あなたはstd::distance機能の両方を渡し、2回の反復子beginendを作成します。この関数は、beginendの間の距離を計算します。この距離は入力ストリームの文字列の数だけです。反復子beginは入力ストリームからの文字列を反復処理するため、は反復子の末尾を定義します。beginが反復を停止します。

std::istream_iterator<std::string> begin(std::cin), end; 
        //^^^^^^^^^^^ 

あなたはcharにこれを変更する場合は、beginは、次のプログラムはの文字数をカウントすることを意味しており、charのIteratorます:std::istream_iteratorにテンプレート引数がstd::stringあるので、文字列の上にbegin繰り返し処理がある理由入力ストリーム:

#include <iostream> 
#include <algorithm> 
#include <iterator> 

int main() { 
     std::istream_iterator<char> begin(std::cin), end; 
     size_t count = std::distance(begin, end); 
     std::cout << count << std::endl;   
     return 0; 
} 

デモ:http://www.ideone.com/NH52y

シム同様に、<iterator>ヘッダのイテレータと<algorithm>ヘッダの汎用関数を使用し始めると、多くのクールなことができます。

たとえば、入力ストリーム内の行数を数えたいとします。だから、上記のプログラムを変更して仕事を完了させるのですか?文字数をカウントするときにstd::stringからcharに変更する方法は、今すぐline(の代わりに)を反復できるように、それをlineに変更する必要があることをすぐに示唆しています。

lineクラスが標準ライブラリに存在しないように、我々は1に自分自身を定義するためにきた、しかし興味深いのは、以下に示すように、我々は完全な作業コードで、空のそれを保つことができるということです。

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <string> 

struct line {}; //Interesting part! 

std::istream& operator >>(std::istream & in, line &) 
{ 
    std::string s; 
    return std::getline(in, s); 
} 

int main() { 
     std::istream_iterator<line> begin(std::cin), end; 
     size_t count = std::distance(begin, end); 
     std::cout << count << std::endl;   
     return 0; 
} 

はい、lineと一緒にlineにもoperator>>を定義する必要があります。これは、std::istream_terator<line>クラスで使用されています。

デモ:http://www.ideone.com/iKPA6