0

cinに問題があります。

int main(void)
{
    int a;
    float b;
    cin >> a >> b;
}

入力として浮動小数点数(3.14など)を指定すると、完全な値(3.14)ab取得されません。出力はa = 3、b=0.14です。

cin入力をスペース、タブ、またはリターンで分割することは知っていますが、「ドット」は分割しませんよね?

そして、なぜ次のコードが機能するのでしょうか?

int main(void)
{
    int i=0;
    int k=0;
    float j=0;

    cin >> i >> k >> j;    // i =3, j=k=0
}

そしてもう1つの問題は、コンパイラーがこれを実現するためにどのようなメリットがあるのでしょうか。

ありがとう!

4

4 に答える 4

4

aタイプがであると宣言しましintた。その場合、「。」で何をすることを期待しますか?

failbit取得された入力は、適切なタイプの要素として解釈できませんでした。一部のeofbitの場合もfailbitを設定することに注意してください。

あなたが持っている他の言及はうまくいきますあなたが尋ねている問題は何ですか?3つの変数を編集しましcinたが、ここで何を期待しましたか?0はfloatまたはintに有効です。

于 2012-10-22T19:54:12.543 に答える
2
cin >> a >> b;

3.14の入力が与えられた場合、ドットは整数の構文に適合しないため、ドット(ピリオド)の最初の解析。2番目の解析は.14で取得され、これは問題なく解析されます。

cin >> i >> k >> j;

これは、3.14の入力では問題があります。最初の解析は再びドットで停止します。2番目の解析はドットで再開できないため、入力ストリームを失敗としてマークします。

I / Oを行うときは、常にステータスを確認してください。

于 2012-10-22T19:57:19.093 に答える
1

cinは入力「3.14」を読み取っていて、それを整数に入れてから浮動小数点数にするように要求します。

したがってcin、読み始め、「3」を見つけ、次に「。」を見つけます。これは整数ではありません。3をに格納しa、続行します。「.14」は有効なフロートであり、bに入れます。

次に、、、を読むように依頼intintますfloat。2番目の整数は一致せずcin停止しますが、機能しているように見えます。実際、失敗しました。

コンパイル時に入力がわからないため、コンパイラは、機能しないことを実行していることを警告できません。

于 2012-10-22T19:57:04.947 に答える
1

フォーマットされた入力関数は非常に単純に機能します。

  1. 先頭の空白がある場合はスキップします。
  2. 彼らは与えられたタイプに一致するフォーマットを読み込もうとします。
  3. データが必要な形式と一致しないために値の読み取りに失敗した場合は、を設定しstd::ios_base::failbitます。読み取りに失敗した場合、入力は読み取ろうとした変数を変更しないでください(標準の入力演算子はこの規則に従いますが、ユーザー定義の入力演算子は変更しない場合があります)。

読み込もうとする最初の値はですint。読み取りintとは、オプションの先行記号が読み取られ、その後に一連の数字が続くことを意味します(設定と指定された値に応じて、ストリームは10進数ではなく8進数または16進数を読み取る場合があります)。つまり、はint3を受け取り、読み取りはの直前で停止し.ます。

次に読む内容に応じて、次の読み取りが失敗するか、失敗します。

  • 最初のコードでは、オプションの符号で始まり、オプションの整数部分、オプションの千の区切り記号、オプションの小数部分、オプションの指数が続く浮動小数点値を読み取ろうとします。整数部分または小数部分のいずれかに少なくとも1桁が必要です。あなたの例では、数千の個別の部分とそれに続く小数部分しかありません。
  • 整数を読み込もうとすると、.anの有効な部分ではないaが見つかりint、読み取りに失敗します。

値の読み取りを試みた後は、読み取り操作が成功したかどうかを常に試行し、潜在的なエラーを報告する必要があります。

if (in >> value) {
    std::cout << "successfully read '" << value << "'\n";
}
else {
    std::cerr << "failed to read a value from input\n";
}

読み取りに失敗した後は、たとえば、を使用してクリーンアップする必要がある場合があることに注意してください。

in.clear();
in.ignore();

これにより、最初にエラーフラグがクリアされ(これがないと、ストリームはデータを読み取ろうとする試みをすべて無視します)、次に次の文字を無視します。

于 2012-10-22T20:04:28.593 に答える