strtol関数、及びstrtoul, strtoq, strtouq関数は、文字列を整数型の数値に変換する関数です。文字列中の最初に出現する数字の列を第三引数で指定された基数で変換します。
long v = strtol("9", NULL, 10); // 9 == v
double v = strtod("3.14", NULL); // 3.14 == v
long v = strtol("99yen", NULL, 10); // 99 == v
long v = strtol(" 8", NULL, 10); // 8 == v
long v = strtol("76 5", NULL, 10); // 76 == v
strtol("11", NULL, 2); // 3 ( 2進数)
strtol("11", NULL, 8); // 9 ( 8進数)
strtol("11", NULL, 10); // 11 (10進数)
strtol("11", NULL, 16); // 17 (16進数)
strtol("0x11", NULL, 0); // 17 (16進数)
strtol("011", NULL, 0); // 9 ( 8進数)
strtod("0x11", NULL); // 17 (16進表記からの変換)
strtod("011", NULL); // 11 (10進表記からの変換) => 8進表記には非対応
strtod("1e3", NULL); // 1000 (指数表記からの変換)
strtof("nan", NULL); // nan (非数)
仕様
#include <stdlib.h>
long strtol(const char *nptr, char **endptr, int base);
unsigned long strtoul(const char *nptr, char **endptr, int base);
long long strtoq(const char *nptr, char **endptr, int base);
unsigned long long strtouq(const char *nptr, char **endptr, int base);
引数 | 仮引数名 | 説明 |
---|---|---|
第一引数 | nptr | 変換対象の文字列 |
第二引数 | endptr | 変換終了した位置 |
第三引数 | base | 基数 |
strtol関数、及びstrtoul, strtoq, strtouq関数は、第一引数nptr
に指定された文字列を第三引数base
で指定された基数で変換します。文字列の途中で変換が失敗した場合、その途中位置へのアドレスが、第二引数endptr
が指すポインタへと格納されます。変換成功時には、nptrの文字列の末尾文字(\0
)または変換終了位置へのアドレスがendptrへ格納されます。
char *endptr;
long result = strtol("99yen", &endptr, 10);
result; // 99
*endptr; // 'y'
変換が行えない場合には戻り値として0
が返されます。値のオーバーフローまたはアンダーフローが発生した場合にはそれぞれ定数値LONG_MAX
、LONG_MIN
を返し、errnoに定数ERANGE
を格納します。
strtol("yen", NULL, 10); // 0
long result = strtol("9223372036854775808", NULL, 10); /* 9223372036854775808 == 1 + LONG_MAX */
result; // LONG_MAX
errno; // ERANGE
指定された文字列の、先頭の空白類文字(スペース、タブ、改行文字等を含む)の並びは無視されます。なお空白類文字はisspace関数の既定に沿ったものとなります(' '
, '\t'
, '\n'
, '\r'
, '\v'
, '\f'
)。
strtol("\t\n\r\v\f 9", NULL, 10); // 9
数字列の先頭に付随する負符号と正符号は数値変換時に考慮されます。
strtol("-9", NULL, 10); // -9
strtol("+9", NULL, 10); // 9
strtol("- 9", NULL, 10); // 0
第三引数の基数に16
が指定された場合、数字列先頭の文字列(0x
, 0X
)の記述は容認されます。
strtol("0x11", NULL, 16); // 17
strtol("0x11", NULL, 10); // 0
また基数に0
が指定された場合、数字列先頭の基数を表す文字列(0
や0x
, 0X
)を元に基数が自動的に判定されます。
strtol("0x11", NULL, 0); // 17 (16進数として変換される)
strtol("011", NULL, 0); // 9 ( 8進数として変換される)
strtol("11", NULL, 0); // 11 (10進数として変換される)
基数を表すプレフィックスが0
だった場合には、基数は8進数として解釈され、0x
,0X
だった場合には16進数と解釈されます。それ以外の場合は10進数として解釈されます。
strtol関数の応用例については、以下のページが参考になります。