1

このコードを考えると:

#include <cstdio>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::string;

int main() {
        int a;
        string b;

        cin >> a;
        cin >> b;

        return 0;
}

g++でコンパイルして実行してみました。に char を代入するときa、最初cinに 、次の命令がスキップされるようです。

getchar()最後の 2 行の間に2 つの命令を追加しても、2つ目だけgetchar()が実行されるようです。誰かが低レベルで何が起こっているのかを正確に説明できますか?

編集:

このデバッグ コードの使用:

#include <cstdio>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
        int a;
        string b;

        cin >> a;
        cin >> b;
        cout << "a is "<< a << endl;
        cout << "b is "<< b << endl;
        getchar();

        return 0;
}

INPUT 1テスト

OUTPUT a は 1 b は test * getchar は実行されません *

入力 1 テスト

OUTPUT a は 1 b はテスト

INPUT テスト

OUTPUT a は 0 b は

入力 t

// 秒をスキップcin

OUTPUT a は 0 b は

注: getchar()一度も実行されていません。

4

3 に答える 3

2

おそらく、最初の文字の後で Enter キーを押します。その入力を消費するコードがないため、空の文字列が得られます。あなたのコードは 2 つの入力の間にセパレーターを想定していないので、何も入力しないでください。

于 2012-05-23T09:17:58.820 に答える
0

a を入力してcharan を読みたい場合intcinストリームにはそのfailbitセットがあります。操作が失敗した場合は呼び出しcin.fail()が返されtrueます (etherfailbitまたはbadbitが設定されています)。そこから適切に行動できます。

cinテスト用に に変換できることに注意してくださいbool。標準によれば、このブール値は と同じ!cin.fail()であり!cin、 と同じcin.fail()です。以下はどちらも同じですが、2 番目の方が読みやすいと考える人もいるかもしれません。

if(!cin) {
  // cin is in failed state
}

if(cin.fail()) {
  // cin is in failed state
}

cin失敗状態にcinなると、ストリームを良好な状態にリセットするまで、読み取り操作は何も行われません。を呼び出すことでそれを行うことができますcin.clear()

ただし、問題のあるキャラクターがまだストリーム内にあることも認識しておく必要があります。つまり、失敗状態の原因となった整数以外の文字は、ストリーム内に残ります。エラーから回復する方法に応じて、これをどのように処理するか。1つの可能性は、電話することです

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

これにより、現在の行がクリアされます。その後、再度入力を求めることができます。

于 2012-05-23T09:51:39.027 に答える