この関数の目的
strtol()は、整数を表した文字列を long int 型に変換する。
定義
#include <stdlib.h> long int strtol(const char *nptr, char **endptr, int base);
働き
この関数は、 nptr が指す文字列の最初の部分を long int での表記に変換する。 まず、入力文字列を3つに分ける。 最初の、省略可能な空白(isspace()で識別される)の連続と、変換の対象となる base によるある基数の整数定数の形をした部分(この部分を以後「主体」と呼ぶ)と、最後にあるヌル文字を含む認識されない文字列にである。 次に、主体となる部分を整数に変換し、結果を返す。
base の値がゼロならば、変換可能な主体の形は以下の点を除いた整数定数と同じである。 すなわち、省略可能な正か負の符号を持てるということと、整数接尾辞がないということである。 base の値が2と36の間であれば、変換可能な主体の形は以下の点を満たす base を基数とする文字と数字の連続である。 すなわち、省略可能な正か負の符号を持てるということと、整数接尾辞がないということである。 a (または A )から z (または Z )までの文字は 10 から 35 までの数値を表す。 表す数字が base より小さい文字のみ許される。 base の値が 16 なら、 0x または 0X の接頭辞が符号の後にについていてもよい。
前述の主体が取るべき形は、空白以外の文字で始まる入力内で最長の部分文字列として定義される。 入力文字列の中身が無いとか、空白ばかりであるとか、最初の空白でない文字が符号や許される文字や数字でない場合には、主体はない。
主体が変換可能で base の値がゼロならば、最初の数字から後は整数定数と同じように解釈される。
体が変換可能で base の値が2と36の間であれば、これは変換の基数として使われ、各文字の値は前述したとおりである。
主体が負の符号で始まる場合、変換後の数値は負になる。
endptr が NULL
でなければ、最後の文字列へのポインタが endptr が指すオブジェクトに格納される。
"C"ロケール以外では処理系定義の主体の形が追加対応されていてもよい。
主体がない場合や変換可能でない場合は変換は行われず、 endptr が NULL
でなければ、 nptr の値が endptr が指すオブジェクトに格納される。
返り値は、存在するならば変換された値である。変換できなかった場合、ゼロが返る。
本来の数値が表現可能な範囲を超えていた場合、(値の符号による) LONG_MAX
か LONG_MIN
が返り、 errno
には ERANGE
が格納される。
解説
この関数の仕様はプログラマが読んでも疲れるだけである。これの完全な理解が必要なのはコンパイラの製作者ぐらいのものだろうと思われる。 その場合は原文の規格書を取り寄せた方がよかろう。
endptr にポインタのアドレスを渡してやれば解析が終わった直後の文字へのポインタを入れてくれることとか、 base に基数を入れられるということぐらいは知っておくに値するかもしれない。
16進数を読み込みたければ、strtol(nptr, NULL, 16)
などとすればよい。
ちなみに基数とは n 進数というときの n のことである。