【C言語】strtol関数|strto関数群(strtol, strtoul, strtoq, strtouq)完全解説

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_MAXLONG_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が指定された場合、数字列先頭の基数を表す文字列(00x, 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関数の応用例については、以下のページが参考になります。

オーバーフロー/アンダーフローの検知
strtolの結果をint型への変換する

広告