strtol
strtol (string to long integer) およびstrtoul (string to unsigned long integer) とは、それぞれ引数の文字列をC言語の符号付き長整数型long
および符号無し長整数型unsigned long
に変換する標準Cライブラリの関数である。ヘッダーファイル<stdlib.h>
に宣言されている。
形式
[編集]#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);
unsigned long int strtoul(const char *nptr, char **endptr, int base);
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);
unsigned long int strtoul(const char * restrict nptr, char ** restrict endptr, int base);
機能
[編集]文字列
[編集]第1引数nptr
の文字列では、
もしくは-
の後に、以下のものを1つ以上続けて書くことができる。
0
から9
の数字A
からZ
またはa
からz
のアルファベット文字
符号は省略することもできる。
また、第3引数base
で、2から36までの基数を指定することができる。base
が0の場合は、数字またはアルファベット文字部分の先頭で判断する。
文字列先頭に空白があった場合は無視される。
第2引数endptr
がNULL
でない場合、endptr
が指しているアドレスに変換終了位置へのポインタが保存される。
戻り値
[編集]変換が成功した場合は、変換した値を返す。
変換に失敗した場合、0
を返す。
正しい値が表現可能な範囲に収まらない場合、strtol
はLONG_MIN
もしくはLONG_MAX
を返す。strtoul
はULONG_MAX
を返す。また、errno
にERANGE
が設定される。
シーケンスがマイナス符号-
で始まる場合、変換結果は数値部分の絶対値を戻り値の型において符号反転させたものとなる。このため、strtoul
は数値部分の絶対値がULONG_MAX
以下であれば変換が成功し、シーケンスがマイナス符号で始まる場合はunsigned long
型において単項のマイナス演算子-
が適用された結果(ラップアラウンドした値)が返却される。
strtoll/strtoull, strtoimax/strtoumax
[編集]C99以降は、以下のような変換関数も規定されている。
#include <stdlib.h>
long long int strtoll(const char * restrict nptr, char ** restrict endptr, int base);
unsigned long long int strtoull(const char * restrict nptr, char ** restrict endptr, int base);
#include <inttypes.h>
intmax_t strtoimax(const char * restrict nptr, char ** restrict endptr, int base);
uintmax_t strtoumax(const char * restrict nptr, char ** restrict endptr, int base);
strtoll
: 戻り値がlong long
型で、範囲外の場合にLLONG_MIN
またはLLONG_MAX
を返す。strtoull
: 戻り値がunsigned long long
型で、範囲外の場合にULLONG_MAX
を返す。strtoimax
: 戻り値がintmax_t
型で、範囲外の場合にINTMAX_MIN
またはINTMAX_MAX
を返す。strtoumax
: 戻り値がuintmax_t
型で、範囲外の場合にUINTMAX_MAX
を返す。
long long
とunsigned long long
は少なくとも64ビットの値を表現できることが規格で保証される。
intmax_t
とuintmax_t
は<stdint.h>
で定義されている型で、それぞれ処理系で表現可能なあらゆる符号付き整数値または符号無し整数値を格納できる型である。
atoi/atol
[編集]類似の機能を持つ標準関数にatoi
やatol
などがあるが、こちらはエラーが発生した場合の動作が規定されておらず、strtol
などと比べて堅牢性に欠けるため、atoi
やatol
を非推奨としているガイドラインもある[2][3][4]。
脚注
[編集]出典
[編集]関連項目
[編集]外部リンク
[編集]- strtol, strtoll - cppreference.com
- strtoul, strtoull - cppreference.com
- strtoimax, strtoumax - cppreference.com
- strtol(3) - Linux man page
- strtoul(3) - Linux man page
- strtol(3) | FreeBSD Manual Pages
- strtoul(3) | FreeBSD Manual Pages
- strtol, wcstol, _strtol_l, _wcstol_l | Microsoft Learn
- strtoll, _strtoll_l, wcstoll, _wcstoll_l | Microsoft Learn
- strtoul, _strtoul_l, wcstoul, _wcstoul_l | Microsoft Learn
- strtoull, _strtoull_l, wcstoull, _wcstoull_l | Microsoft Learn
- strtoimax, _strtoimax_l, wcstoimax, _wcstoimax_l | Microsoft Learn
- strtoumax, _strtoumax_l, wcstoumax, _wcstoumax_l | Microsoft Learn