0

cin.peek()メソッドを使用してこのコードを取得しました。qwertyu$[Enter]プログラムへの入力がすべて正常に機能しているように見えるが、qwerty[Enter]$二重ドル記号を入力した場合にのみ機能しているように見える場合、奇妙な動作に気づきましたqwerty[Enter]$$。一方、私が使用するときはcin.get(char)すべてがうまく機能します。

#include <iostream>
#include <cstdlib>

using namespace std;



int main()
{
char ch;
int count = 0;

while ( cin.peek() != '$' )
{
    cin >> ch;         //cin.get(ch);
    count++;
}

cout <<  count << " liter(a/y)\n";

system("pause");
return 0;
}


//Input:
// qwerty$<Enter>  It's ok
//////////////////////////
//qwerty<Enter>
//$                Doesn't work
/////////////////////////////
//qwerty<Enter>
//$$                 works(?)
4

2 に答える 2

2

これは、ユーザーが Enter キーを押すまで、プログラムがコンソールから入力を取得しないためです (その後、Enter キーをもう一度押すまで、次の行に入力された内容は表示されません)。これは正常な動作であり、これに対してできることは何もありません。さらに制御したい場合は、UI を作成します。

于 2012-09-26T12:21:35.167 に答える
-1

正直なところ、現在受け入れられている答えはそれほど良いとは思いません。

うーん、もう一度見てみると、operator<<はフォーマットされた入力コマンドでありget()、プレーン バイナリであるため、フォーマットされたバージョンは、フォーマット マジックを実行するために 1 文字以上の入力を待機している可能性があります。

get()それができることを見るよりもずっと複雑だと思います。設定されたすべてのフラグに従って>>a を読み取ることが絶対に確実になるまでハングし、その後戻ると思います。charしたがって、1 文字だけではなく、より多くの入力を待つことができます。たとえば、指定できますskipws

charfromを取得するには、入力の複数の文字を覗く必要があることは明らか\t\t\t testです。

get()はそのようなフラグの影響を受けず、文字列から文字を抽出するだけだと思います。そのため、ブロックしない方法で動作する方が簡単です。get()

現在受け入れられている答えが間違っていると考える理由は、プログラムが[enter]他のフラッシュのようなものまで入力を取得しないと述べているためです。get()私の意見では、バージョンが機能するため、これは明らかに当てはまりません。入力が得られなかった場合、なぜそうなるのですか?

おそらくバッファリングが原因でブロックされる可能性がありますが、可能性ははるかに低いと思います。あなたの例ではそうではありません。

于 2012-09-26T15:46:00.163 に答える