
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 関数の改訂版は次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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) && 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 サイトの他の関連記事を参照してください。