2017-09-07 7 views
0

私は、このようなコンソールからの入力を読み取るしようとすると:なぜcoutが機能しないのですか?

6 6 4 
1 1 1 
2 1 1 
1 2 1 
2 2 1 

次のコード片では、トリプレットのライン毎に、私は単純な希望を計算するために(N/A + 1)*(M/A + 1 )、結果をコンソールに出力します。

while(cin.get()!='\n'){ 
    int n=0, m = 0, a =0; 
    cin >> n >> m >> a; 

    cout <<(n/a+1) * (m/a+1) << endl; 

} 

ただし、動作しません。なぜですか?ここで

+3

あなたは 'cin.get()'が入力バッファから文字を抽出することを知っています。そのキャラクターは永遠に失われます。一度に1行を読みたい場合は、['std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)と[' std :: istringstream' ](http://en.cppreference.com/w/cpp/io/basic_istringstream)を参照してください。 –

+3

スタックオーバーフローへようこそ。 "それは動作しません"あなたは何が起こるか教えていただけますか? – philant

+0

shin私はあなたの質問に答えました、あなたはそれを見ましたか? – gsamaras

答えて

7

while(cin.get()!='\n') 

あなたが標準入力から文字、ループの条件が評価されるたびに抽出します。

この結果、トリプレットを解析しようとすると、その文字が既に消費されています。


使用std::getline()トリプレットを取得し、ラインによって、各ラインからの入力ラインを解析します。

例:

#include <sstream> 
#include <string> 
#include <iostream> 

int main() { 
    std::string line; 
    while (std::getline(std::cin, line)) 
    { 
     std::istringstream iss(line); 
     int n, m, a; 
     if (!(iss >> n >> m >> a)) { break; } // error 
     std::cout <<(n/a+1) * (m/a+1) << std::endl; 
    } 
    return 0; 
} 

出力:

4 
4 
6 
6 
9 

PS:FYI (n/a+1) * (m/a+1)オーバーフローn場合とm 100,000であり、aは一桁の数値であるだろう。タイプlong intシースmnaに乗算結果をキャストすると、const_cast<long int>((n/a+1) * (m/a+1))のように整数になります。

関連する問題