2017-10-23 22 views
0

私は初心者で、1文字のみを入力するように制限しようとしています。cin.get(char)を認識しています。他の文字はバッファに残さないようにします。ここで私のコードのサンプルはEOFを使用していますが、動作していないようです。C++で1文字のみを入力するようにユーザを制限するには

 #include <iostream> 
    #include <sstream> 
    using namespace std; 

    string line; 
    char category; 
    int main() 
    { 
     while (getline (cin, line)) 
     { 
      if (line.size() == 1) 
      { 
       stringstream str(line); 
       if (str >> category) 
       { 
        if (str.eof()) 
         break; 
       } 
      } 
      cout << "Please enter single character only\n"; 
     }     
    } 

これは数字入力に使用していますが、eofはうまく動作します。 の場合、str.eof()は偽と思われます。 誰かが説明できますか?前もって感謝します。

答えて

0

eofフラグは、より前にストリームを読み込もうとした場合にのみ設定されます。 str >> categoryがストリームの最後を過ぎて読み取られた場合、if (str >> category)はfalseと評価され、テストするループには入力されませんでした(str.eof())。行に文字が1つある場合は、の2つの文字を読んでeofをトリガーする必要があります。 2文字を読むことは、それがどれくらいの長さであるかを確認するために、長さlineをテストするよりはるかに努力しています。

while (getline (cin, line))コンソールからすべての行を取得しました。あなたがstringstreamでそれを消費しない場合、それは問題ではありません。でループバックすると、そのものは消えてしまいました。cin

実際には、stringstreamさんはあなたに恩恵をかけていません。読み取られた行の長さを確認したら、line[0]を使用できます。

#include <iostream> 
using namespace std; 

int main() 
{ 
    string line; // no point to these being global. 
    char category; 
    while (getline(cin, line)) 
    { 
     if (line.size() == 1) 
     { 
      //do stuff with line[0]; 
     } 
     else // need to put the fail case in an else or it runs every time. 
      // Not very helpful, an error message that prints when the error 
      // didn't happen. 
     { 
      cout << "Please enter single character only\n"; 
     } 
    } 
} 
+0

ありがとう、それは私には大いに役立ちますが、返されたeof値が0である理由は分かりますか? –

+0

@JohnDeverauxは 'eof()'がうまくいかなかった理由を説明するために答えを更新しました。 – user4581301

関連する問題