1

このコードは C++ で書かれており、よくわからない理由で 2 回書かれています。ランダムな文字を入力すると、文字が1回表示され、その下にある文字列も1回表示されると予想されます。しかし、私はこれを出力として取得しません。私は何が欠けていますか?

解決策: cin.ignore() ステートメントを追加すると、読み込まれたリターンも無視されます。私のコードを一度ループさせます。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main()
{
    char letter;

    letter = cin.get();
    while (letter!= 'X')
    {
        cout << letter << endl;
        cout << "this will be written twice for ununderstandable reasons";                
        letter = cin.get();
    }
}

例: cmd scrncで書くと、cback + フレーズの 2 倍になりますthis will be written twice for ununderstandable reasons。だから私がアウトプットだと思ったのは

c
this will be written twice for ununderstandable reasons

実際には

c
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
4

6 に答える 6

2

あなたは改行を忘れていました。cinは、文字を入力した後に入力した改行を含むすべての文字を読み取ります。この動作が望ましくない場合は、特に改行を確認する必要があります。

while (letter!= 'X')
{
      if (letter == '\n')
      {
          letter = cin.get();
          continue;
      }
      cout<<letter<<endl;
      cout<<"this will be written twice for ununderstandable reasons";
      letter= cin.get();
}
于 2013-11-05T11:54:28.483 に答える
2

get()リターンを押すたびに改行文字を含む、フォーマットされていない関数ですべての文字を読み取っています。

何をしようとしているのかによっては、フォーマットされた入力 ( cin >> c) を使用してすべての空白をスキップできます。または、各文字をテストして、興味のない改行などを無視することもできます。getline(cin, some_string)または、行全体を読み取り、それを処理するために使用できます。

于 2013-11-05T11:56:11.633 に答える
2

誰もが既に述べたように、Enter キーを押すたびcinに改行マーカーが追加されます。\n別の解決策はcin.ignore();、すべての後に配置することcin.get();です。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

int main()
{
    char letter;

    letter = cin.get();
    cin.ignore();
    while (letter!= 'X')
    {
          cout<<letter<<endl;
          cout<<"this will be written twice for ununderstandable reasons";
          letter= cin.get();
          cin.ignore();
          }
}
于 2013-11-05T12:01:31.193 に答える
2

「これは 2 回書き込まれます..」というテキストは、必ずしも 2 回印刷されるとは限りません。

「qwerty」+ ENTER と入力すると、ストリームに「qwerty\n」が含まれ、次の出力が表示されます。

this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons

文字列 "qwerty\n" と同じ数の文字があります。問題はそれです

cin.get()

入力したすべての文字をストリーム/バッファ (文字の文字ではない) に入れますが、cin.get() 呼び出しごとに1 つの文字を処理します。

'abcXd' + enter と入力すると、プログラムは行の上に 3 回出力し、X で停止します。

于 2013-11-05T12:11:09.043 に答える
2

文字を入力すると、(Enter キーを押して) 改行文字も入力バッファーに含まれます。

Cリファレンスから:

区切り文字が見つかった場合、入力シーケンスから抽出されず、ストリームから抽出される次の文字としてそこに残ります (区切り文字を破棄する別の方法については getline を参照してください)。

cin.sync()after everyを使用しcin.get()てバッファをクリアするだけで、準備完了です。

于 2013-11-05T11:59:08.943 に答える
1

cin.get()new-lineも文字を読み取るために発生します。Enter記号なしで押すか、 のような文字列を入力してみてくださいabc。たとえば、次のように処理する必要があります。

while (letter = cin.get()) {
    if (!isalpha(letter)) { continue; }
    // handling user inputted alpha
}
于 2013-11-05T12:06:39.477 に答える