ホームページ > バックエンド開発 > C++ > C および C で strtol を使用するときにエラーを適切に処理するにはどうすればよいですか?

C および C で strtol を使用するときにエラーを適切に処理するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-25 15:35:09
オリジナル
863 人が閲覧しました

How Can I Properly Handle Errors When Using strtol in C and C  ?

エラー処理を伴う strtol の適切な使用法

次の C または C プログラムは、strtol が返すという事実に基づいて、文字列を長整数に変換します。変換が成功した場合は NULL。ただし、値 55 を指定すると、次のメッセージが表示されて失敗します。

./convertToLong 55
Could not convert 55 to long and leftover string is: 55 as long is 55
ログイン後にコピー

この記事では、strtol のエラーを正しく検出し、指定されたプログラムの問題に対処する方法について説明します。

strtol のエラー処理

strtol (および次のような関連関数) の公式仕様strtoll) は次のように述べています:

  • 入力文字列を空白、件名 (整数)、および認識できない文字の 3 つの部分に分割します。
  • 件名が空または無効な場合、変換は行われません。
  • 変換された値が表現可能な範囲外の場合、endptr は入力文字列の先頭を指します。適切な最小値または最大値 (LONG_MIN または LONG_MAX など)、errno は ERANGE に設定されます。

プログラムの修正

C では、strtol からのエラー関数を呼び出す前に errno を 0 に設定することで検出できます。以下の変更された 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)
{
    char *temp;
    bool rc = true;
    errno = 0;
    *val = strtol(str, &amp;temp, 0);

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

    return rc;
}
ログイン後にコピー
' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); // cerr << "Could not convert '" << str << "' to long and leftover string is '" // << temp << "'\n"; return val; }
  • 入力が空、無効、または末尾文字がある場合、エラーを標準エラー出力に出力し、エラーの場合は 0 または LONG_MIN/LONG_MAX を返します。範囲オーバーフローが原因でした。
  • エラーがなかった場合は、変換された結果が返されます。 value.

C では、より柔軟なアプローチは、成功/失敗インジケーターを返し、変換された値を抽出するための別の関数を提供することです。

結論

これらの変更により、parseLong 関数は strtol からのエラーを正しく処理し、アプリケーションが成功または成功を判断できるようになります。変換の失敗を検出し、エラーを適切に処理します。

以上がC および C で strtol を使用するときにエラーを適切に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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