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)ます。:)