ホームページ >バックエンド開発 >C++ >`cin` が型の不一致による無限ループを引き起こすのはなぜですか?

`cin` が型の不一致による無限ループを引き起こすのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-26 09:25:09387ブラウズ

Why Does `cin` Cause Infinite Loops with Type Mismatches?

型が一致しない場合の cin の無限ループについて

cin 関数を使用して入力を読み取る場合、期待される入力が一致しない場合、無限ループが発生する可能性があります。は数値ですが、代わりに文字が入力されます。これは、cin が数値以外の入力に遭遇すると失敗して失敗状態になり、それ以上の入力を求めるプロンプトが表示されないために発生します。

無限ループの原因

提供されたコード:

unsigned long ul_x1, ul_x2;

while (1)
{
  cin >> ul_x1 >> ul_x2;
  cout << "ux_x1 is " << ul_x1 << endl << "ul_x2 is " << ul_x2 << endl;
}

無効な入力が提供された場合、cin は失敗し、その状態のままになります。その結果、ループは cin が入力を読み取るブロックに再び入ることはなく、無限ループが発生します。

無限ループの防止

この問題を回避するには、次のことを検証します。 cin の失敗状態を使用した入力:

if (cin.fail())
{
  cout << "ERROR -- You did not enter an integer";

  // Clear fail state and discard bad input
  cin.clear();
  cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

代替:文字列ベースの検証

より複雑な検証の場合、特定の文字列ベースのチェックを実行する前に入力を文字列として読み取り、期待される形式を満たしていることを確認すると有益な場合があります。

以上が`cin` が型の不一致による無限ループを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。