strtod
私はバリアントに慣れてきました。なぜstrtoi
同梱がないのか不思議です<stdlib.h>
。整数型がこのパーティーから除外されているのはなぜですか?
atoi
具体的には、安全機能を備えた のバージョンがない理由を尋ねていstrtod
ます。
strtol()
文字列を整数に変換します。長整数ですが、それでも整数です。ありますがatoi()
、無効な入力からのエラー報告のメカニズムがないため、ほとんどの場合は避ける必要があります。
stdlib.h に strtoi がないのはなぜですか?
重要な必要はありません。
初期の C では、 より広い標準の符号付き整数型はなく、 のlong
ようなすべての狭い変換は、以下で行うように -int
から行うことができました。strtol()
IMO、これらとそのunsigned
対応物には、現在の標準 C ライブラリ (C17/18) の C 関数と設計上の欠点がありません。
多くのシステムでは、long
とint
の範囲は同じであるため、別のstrtoi()
. atoi()
に変換するための迅速で汚いコードの必要性を満たしますが、int
エラー検出が欠けている可能性があります。エラーが発生すると、atoi()
未定義の動作(UB) が発生します。などもありませstrto_short()
んstrto_signchar()
。
代用を作成するのはかなり簡単strtoi()
です。単純化が存在します。
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
static long str2subrange(const char *s, char **endptr, int base,
long min, long max) {
long y = strtol(s, endptr, base);
if (y > max) {
errno = ERANGE;
return max;
}
if (y < min) {
errno = ERANGE;
return min;
}
return y;
}
// OP's goal
int str2i(const char *s, char **endptr, int base) {
#if INT_MAX == LONG_MAX && INT_MIN == LONG_MIN
return (int) strtol(s, endptr, base);
#else
return (int) str2subrange(s, endptr, base, INT_MIN, INT_MAX);
#endif
}
short str2short(const char *s, char **endptr, int base) {
return (short) str2subrange(s, endptr, base, SHRT_MIN, SHRT_MAX);
}
signed char str2schar(const char *s, char **endptr, int base) {
return (signed char) str2subrange(s, endptr, base, SCHAR_MIN, SCHAR_MAX);
}
#include <stdint.h>
int16_t str2int16(const char *s, char **endptr, int base) {
return (int16_t) str2subrange(s, endptr, base, INT16_MIN, INT16_MAX);
}
[2021年編集]
将来のライブラリの指示との競合を避けるために、名前が からstrto...()
に変更されましたstr2...()
。
2
暗示to
。
str
、mem
、またはwcs
小文字で始まる関数名は、<string.h>
ヘッダーの宣言に追加できます。C17dr § 7.31.13 1
整数はパーティから除外されません:文字列を整数型でstrtol
ある に変換する があります。long
これは私が使ってきたものです。
long long_val;
int int_value;
errno = 0;
long_val = strtol (theString, NULL, 10);
if (errno)
handle_error;
if ((long) someIntMin > long_val || long_val > (long) someIntMax)
handle_invalid;
int_value = (int) long_val;
SEE ALSO
あなたのマンページのセクションを見落とさないでください:)
SEE ALSO atof(3), atoi(3), atol(3), strtol(3), strtoul(3)
を探していatoi(3)
ます。:)