ホームページ >バックエンド開発 >C++ >C で strtol を使用して文字列を長整数に変換するときにエラーを確実に検出するにはどうすればよいですか?

C で strtol を使用して文字列を長整数に変換するときにエラーを確実に検出するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-14 20:36:16558ブラウズ

How Can I Reliably Detect Errors When Converting Strings to Long Integers Using strtol in C?

strtol を使用した文字列から Long への変換でのエラーの検出

C プログラミングでは、strtol 関数は、文字列表現を変換するためによく使用されます。長整数をその数値に変換します。ただし、strtol を単独で使用すると、常に十分なエラー処理が提供されるとは限りません。

問題:

提供されたコードは、プログラムが文字列を長整数に正しく変換するシナリオを示しています。 、変換が成功したにもかかわらず、「変換できませんでした」というエラー メッセージも出力されます。これは、strtol が文字列を正常に変換した場合、2 番目のパラメーター (残りの文字列を示す) が NULL であるとプログラムが想定しているためです。ただし、特定の状況では、変換が成功した場合でも、NULL 以外の文字列が残る可能性があります。

解決策:

strtol からのエラーを正確に検出するには、次の改善点を検討してください。

  1. 専用関数を使用して呼び出すstrtol: これにより、コードの構成と読みやすさが向上します。
  2. 複数のエラー条件を確認します: strtol エラーの処理は複雑です。残り物に加えて、無効な数値文字列、数値のオーバーフロー、先頭/末尾の空白もチェックする必要があります。
  3. strtol: を呼び出す前に、errno を明示的に 0 に設定します。これにより、errno が適切であることが保証されます。発生したエラーを示すように設定します。
  4. 特定のエラーを確認してください値: エラーの場合は、ERANGE (数値オーバーフロー) に関連付けられた errno 値を確認します。

改訂された関数:

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

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">if (parseLong(str, &value))
    // Conversion successful
else
    // Handle error
' || ((*val == LONG_MIN || *val == LONG_MAX) && errno == ERANGE)) rc = false; return rc; }

使用法:

この改訂された関数変換が成功したかどうかを示すブール値を返します。次のように使用できます:

追加メモ:

  • 関数をさらにカスタマイズして、空白のトリミングを処理したり、変換を制限したりできます。 10 進数値のみ。
  • シナリオによっては、エラー コードを返すなど、より詳細なエラー レポート メカニズムが必要になる場合があります。例外をスローします。

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

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