3

わかりました、私は何時間もこれにいました....

//after a character is entered, library routines are used to uppercase the
letters. loops the program until "1" is entered

char letter;

while (letter != '1')
{
    cout << "Enter a letter: ";
    cin.get(letter);
    cout << char(toupper(letter)) << '\n';
}

すべてが機能しますが、「文字を入力してください:」が2回...

ここにサンプル出力があります

Enter a letter: h
H
Enter a letter: 

Enter a letter: k
K
Enter a letter: 

Enter a letter: a
A

私はそれがこのように見えるようにしたい

Enter a letter: h
H
Enter a letter: k
K
Enter a letter: a
A

なぜこれを行っているのか説明してもらえますか....

4

3 に答える 3

8

データを入力するときは、文字を入力してから を押しENTERます。これにより、レターとリターン文字 ( \n) がストリームに追加されます。cin.get()ストリームから抽出する文字がまだある場合は入力を待機しないため、1\nつおきのパスを取得します。

次を追加することで、これをすばやく修正できますcin.ignore

while (letter != '1')
{
    cout << "Enter a letter: ";
    cin.get(letter);
    cin.ignore(256, '\n');
    cout << char(toupper(letter)) << '\n';
}

代わりに、一度に 1 つの文字のみを取得するように>>演算子を使用することもできます。cin.get

while (letter != '1')
{
    cout << "Enter a letter: ";
    cin >> letter;
    cout << char(toupper(letter)) << '\n';
}
于 2013-01-09T23:52:17.333 に答える
3

を に変更するだけcin.get(letter)cin >> letter;、期待どおりに動作します。

編集:これについてさらに情報を提供すると思いました。get() は、ストリームから正確に1文字を抽出します。これにより、他の人が指摘したように改行文字がそこに残ります。get() への次の呼び出しは、ストリームにまだデータがあるため、入力を待つ代わりにそれを抽出してすぐに終了します。>>一方、-operator は、まさにここでやろうとしていることのために作られています: リターン キーが押されるまで stdin から値を読み取ります。したがって、改行も消費するためoperator<<()、ユーザーが新しいデータを入力するまで次の呼び出しがブロックされます。

注:もう 1 つ注意してください: >>-char に抽出すると、ストリームから最大で 1 文字が抽出されますが、ユーザーが Enter キーを押す前にそれ以上の文字を入力することはできません。これにより、次のような出力が生成されます。

niko@lethal-guitar:~$ ./a.out 
Enter a letter: a
A
Enter a letter: asas
A
Enter a letter: S
Enter a letter: A
Enter a letter: S

これは、オペレーターが 1 つの文字と改行を削除し、残りの文字をストリームに保持するためです。これらは、次の 3 回のoperator>>()呼び出しをすぐに終了します。

于 2013-01-09T23:53:00.737 に答える
1

cin.get手始めに、成功するかどうかをチェックしないため。ほぼ確実に、最後に2回読んだ文字を出力します。ループは次のようになります。

while ( letter != '1' && cin.get( letter ) ) ...

また

while ( cin.get( letter ) && letter != '1' ) ...

cin.get()ほとんどのシステムでは、 Enterキーを押すまで戻らないことにも注意してください(キーボードからの入力を想定)。したがって"Enter a letter: "、を出力してから、Enterキーが押されるまで待ちます。次に、を読むまで、入力したすべての文字を読みながら、待たずにループします'\n'。C ++標準には文字ごとの入力に関する規定はなく、それを行うための手法はシステムごとに根本​​的に異なります。

于 2013-01-10T00:20:28.290 に答える