ホームページ  >  記事  >  バックエンド開発  >  `atoi()` を超えて C の数値入力を検証するにはどうすればよいですか?

`atoi()` を超えて C の数値入力を検証するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-21 21:01:12199ブラウズ

How to Validate Numeric Input in C   Beyond `atoi()`?

C での数値入力の検証

整数入力を処理するプログラムでは、ユーザーが有効な数値を指定することが重要です。残念ながら、atoi() 関数は複数桁の整数を扱う場合には不十分です。この記事では、数値入力を検証するための代替方法について説明します。

フェイルビットの使用

C の入力ストリーム (cin) は、解析できない入力に遭遇したときにフェイルビットを設定します。これは、次のように入力を検証するために利用できます。

int n;
cin >> n;
if(!cin) {
    // User did not input a number
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
  • if(!cin) は、フェイルビットが設定されているかどうかを確認します。
  • cin.clear() は、ストリームの状態をリセットします。
  • cin.ignore() は無効な入力をスキップし、

入力オーバーフローの処理

整数が最大許容値を超えると、cin はフェイルビットも設定します。これを防ぐには、入力を読み取る前にストリームの状態をチェックします。

while(!cin.eof()) {
    int n;
    cin >> n;
    if(!cin) {
        // Input error occurred
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    else {
        // Valid input
        process(n);
    }
}

このループは、ファイルの終わり (EOF) に達するまで入力の読み取りと検証を続けます。

その他代替案

  • C 11 stringstream: 入力から stringstream を作成し、整数への変換を試みます。
  • 正規表現 (regex): 正規表現を使用して、特定の数値形式を適用します。
  • Boost ライブラリ: Boost の boost::regex を使用するか、 boost::lexical_cast 入力検証用。

以上が`atoi()` を超えて C の数値入力を検証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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