C ++で複数の文字を読みたいのですが、2番目の文字を読むことはありません。

C ++で2文字だけ読みたいのですが、2文字目は使えません。

#include 
#include 

using namespace std;

int main()
{

    cout << "reading char: ";
    char ch1;
    cin.get(ch1);
    cout << ch1 << endl;

    char ch2;
    cout << "reading char: ";
    cin.get(ch2);
    cout << ch2 << endl;


    return 0;
}

誰もがこの問題を解決するのを手伝ってくれる?

これは出力です:

reading char: a

a

reading char:


Process returned 0 (0x0)   execution time : 2.158 s
Press any key to continue.

*************************

プログラムはここで終了し、2番目の文字を読みません

1
私のために働きます。あなたが抱えている問題は何ですか?ジャムですか?エラー? echo "test" |例えば./test は正しい出力を生成します。
追加された 著者 tadman,
プログラムが出力を表示するには早すぎますか?
追加された 著者 Matt,
エラーなし! 2番目の文字に '\ n'を付けるだけで、ユーザーからは受け取りません
追加された 著者 Shahab Einabadi,

5 答え

The problem here is that standard input (std::cin) is buffered. So the program gets no input until the key is presses (or you fill the buffer). This gives you the impression that the code will always wait for user input.

本当じゃない。現在のバッファが空の場合にのみユーザ入力を待ちます。バッファにデータがある場合は、ユーザ入力を待つのではなく、それを読み込みます。

最初の読み:

cin.get(ch1);

Start of the program so the buffer is empty. So when you read from std::cin the program will pause waiting for the buffer to be flushed then the characters will be read. If you hit A your buffer will flush with two characters in the buffer.

Buffer: 'A' '\n'

あなたの読みは入力から最初の文字を取り出すでしょう: 'A' は入力ストリームに '\ n' を残します:

Buffer: '\n'

2回目の読み取りで、バッファが空ではないことがわかります。

cin.get(ch2);

そして、それがストリームから次の文字を読み込むのを待つ必要はありません。そのため、ストリームから '\ n' 文字を読み取ります。そして続けます。

解決策:

それはあなたが望むものによって異なります。行の最初の文字だけが必要ですか。

std::cin.ignore();//drops the rest of the line.
                  //The next character that will be available will
                  //be the first character of the next line.

あなたはただ空白を無視したいですか? (これはスペース/タブ/改行などです)。

std::cin >> v1 >> v2;

Using the operator>> ignores leading white space, then reads the next value. So it will ignore new lines (they are white space).

1
追加された

Your issue here is get only grabs a single character from the stream. When you enter character for your first input by typing the character and pressing enter you actually put two characters into the stream. The one you entered and then enter key (newline character). That means your second call to get is going to get the newline character that is still in the buffer and not wait for you to enter anything. To fix this you should use the stream extraction operator (operator >>) to read the single character and it will skip over the white space that is left in the buffer. That turns your code into

int main()
{

    cout << "reading char: ";
    char ch1;
    cin >> ch1;
    cout << ch1 << endl;

    char ch2;
    cout << "reading char: ";
    cin >> ch2;
    cout << ch2 << endl;


    return 0;
}
1
追加された

問題は、あなたがcharを入力してenterを押すと、コンソールに改行文字を入力しているということです。そのため、 cin.get()を呼び出すと、改行が ch2 に返され、プログラムは ch1 と空白の改行をから出力します。 ch2 して終了します。

Instead of using cin.get() you should use cin >> ch1 and cin >> ch2

1
追加された
だからcin.get()を使用する方法はありません???
追加された 著者 Shahab Einabadi,

最初の文字を入力してEnterを押すと、2番目のget()呼び出しで改行文字(ASCII 10)が読み取られます。

1
追加された

二番目の文字を受け取れないと言うとき、それを読んでいないという意味ですか?それとも画面にそれを書いていないということですか?

「続行するには任意のキーを押してください」というように宣伝文句を追加して、別の偽の文字を読むことができます。

0
追加された
読みません。 2番目の文字に自動的に「\ n」を付けるだけで、ユーザーから読み取られません。
追加された 著者 Shahab Einabadi,