ホームページ > バックエンド開発 > C++ > C 数値入力プログラムで文字が無限ループを引き起こすのはなぜですか?

C 数値入力プログラムで文字が無限ループを引き起こすのはなぜですか?

Patricia Arquette
リリース: 2024-12-02 21:20:11
オリジナル
507 人が閲覧しました

Why Do Letters Cause Infinite Loops in C   Number Input Programs?

数字の代わりに文字を入力するときの無限ループについて

整数の入力を求めるプログラムを実行すると、よく無限ループが発生します。ユーザーが数字の代わりに文字を入力した場合。この問題は、C での入力処理の仕組みが原因で発生します。

根本原因:

C では、入力の読み取りに cin 関数が使用されます。ただし、数字以外の文字が入力された場合、cin は有効な整数を抽出できません。その結果、cin ストリーム オブジェクト内にフェイルビット フラグが設定され、エラーが示されます。

無限ループの修正:

無限ループを解決するには、以下が必要です。無効な入力シナリオを検出して処理します。この問題を修正するコードの変更部分は次のとおりです。

#include <limits> // Includes numeric_limits for input validation

// (...) Existing code

// user enters a number
cout << "\nPlease enter a positive number and press Enter: \n";
do {
    while (!(cin >> num1)) {
        cout << "Incorrect input. Please try again.\n";

        // Clear the failbit and ignore the remaining input
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    if (num1 < 0)
        cout << "The number you entered is negative. Please enter a positive number to continue.\n";
} while (num1 < 0);
ログイン後にコピー

説明:

  • while (!(cin >> num1)) cin が整数を正常に読み取ったかどうかを確認します。そうでない場合は、内部の do-while ループに入り、エラーを処理します。
  • cin.clear();フェイルビット フラグをリセットし、cin が入力を再度読み取ることができるようにします。
  • cin.ignore(numeric_limits::max(), 'n');改行文字が見つかるまで、すべての文字を読み取り、破棄します。これにより、改行の前に入力された無効な入力はすべて破棄されます。
  • この修正により、プログラムは有効な正の整数が入力された場合にのみループするようになり、無効な入力による無限ループが防止されます。

    以上がC 数値入力プログラムで文字が無限ループを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート