ホームページ > バックエンド開発 > C++ > strtol を正しく使用して文字列を長整数に変換し、潜在的なエラーを処理するにはどうすればよいですか?

strtol を正しく使用して文字列を長整数に変換し、潜在的なエラーを処理するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-25 17:31:14
オリジナル
774 人が閲覧しました

How Can I Correctly Use strtol to Convert Strings to Long Integers and Handle Potential Errors?

strtol の正しい使用法

strtol 関数は、long 整数の文字列表現を long 値に変換します。ただし、この関数を使用する場合は、エラーを正しく処理する方法を理解することが重要です。

指定されたコードでは、誤った仮定により問題が発生します。このコードは、strtol が文字列を正常に変換した場合、2 番目のパラメーターは NULL に等しくなるはずであるという事実に基づいています。ただし、この仮定が常に当てはまるとは限りません。

strtol からのエラーを効果的に検出するには、適切なエラー処理ガイドラインに従う必要があります。

  • Set errno to 0 strtol: を呼び出す前に、標準ライブラリ関数は errno を 0 に設定しないため、各 strtol の前に手動で 0 に設定する必要があります。 call.
  • str と *temp の両方に対して temp をチェックします != ' ': エラー条件は、対象のシーケンスが空であるか、予期された形式を持たない場合に発生します。これは、temp == str またはサブジェクト シーケンスの後の認識できない文字によって示され、*temp != ' ' によってチェックされます。
  • 表現可能な範囲外の値を処理します: 変換された値の場合が long の表現可能な範囲外にある場合、strtol は LONG_MIN、LONG_MAX を返すか、errno を ERANGE に設定します。このようなエラーを正しく処理するために、これをチェックする必要があります。

これらの原則に準拠した parseLong 関数の改訂版は次のとおりです。

static long parseLong(const char *str)
{
    errno = 0;
    char *temp;
    long val = strtol(str, &temp, 0);

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">bool parseLong(const char *str, long *val)
{
    errno = 0;
    char *temp;
    *val = strtol(str, &temp, 0);

    if (temp == str || *temp != '' ||
        ((*val == LONG_MIN || *val == LONG_MAX) &amp;&amp; errno == ERANGE)) {
        return false;
    }

    return true;
}
ログイン後にコピー
' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) { fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); return 0; // or LONG_MIN/LONG_MAX if needed } return val; }

あるいは、エラー処理を分離することもできます。変換結果から、変更されたインターフェースを使用できます:

以上がstrtol を正しく使用して文字列を長整数に変換し、潜在的なエラーを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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