Everything

strtol


文字列を整数(long型)へ変換し,最終文字列へのポインタを格納します。

[所属]

標準ライブラリ

[指定形式]

#include <stdlib.h>

long strtol(const char *str, char **ptr, int base);

[戻り値]

部分文字列が変換できた場合,変換された値を返します。変換できなかった場合,0を返します。

オーバーフローが生じる(変換された値が大きすぎる)場合,LONG_MAX,またはLONG_MINを返し,マクロERANGEをグローバル変数errnoにセットします。

[詳細説明]

strの指す文字列の最初の部分をlong型の表現に変換します。まず,入力文字を次の3つの部分,“最初の空白類”,“baseの値により定められる基数において表現され,整数にする対象となる列”,“(null文字(\0)を含む)最後の1個以上の認識されない文字列”に分割します。その後,対象となる列を整数へ変換し,その結果を返します。

(1)

引数baseは,0,または2~36を指定します。

(a)

baseが0の場合

対象となる文字列の予期される形式は,オプショナルな+符号,または-符号,16進数であることを示す“0x”を前に持つ整数の形式となります。

(b)

baseの値が2~36の場合

対象となる文字列の予期される形式は,オプショナルな+符号,または-符号を前に持ち,baseによって基数が指定された整数を表す文字列,または数字列となります。“a”(または“A”)から“z”(または“Z”)までの英字は10から35までの値を示すものとみなされます。与えられた値がbaseよりも小さい英字しか使用できません。

(c)

baseの値が16の場合

“0x”が文字と数字の列の前(符号が存在する場合は符号の後ろ)に置かれます(省略可能)。

(2)

対象となる列は,空白類以外の最初の文字で始まり,予期される形式を持つ入力文字列の先頭部分の最長の部分列として定義されます。

(a)

入力の文字列が空である場合やすべて空白類で構成されている場合,または空白類でない最初の文字が符号でも許容されうる文字でも数字でもない場合,対象となる列は空となります。

(b)

対象となる列が予期される形式を持ち,かつ,baseの値が0の場合,入力文字列から基数を判断します。0xが先行する文字列は,16進数数値とみなされ,先行0が付いていてxが付いていない文字列は8進数としてみなされます。他の文字列はすべて10進数としてみなされます。

(c)

baseが2から36までの間の値の場合,上述のように,これを変換用基数として使用します。

(d)

対象となる列が-符号で始まる場合,変換結果の値の符号は反転されます。

(3)

最初の文字列を指すポインタ

(a)

ptrがnullポインタでない場合,ptrの指すオブジェクトの中に格納されます。

(b)

対象となる列が空である場合,または予期された形式を持たない場合,変換は行われません。strの値は,ptrがnullポインタでない場合,ptrの指すオブジェクトに格納されます。

備考

本関数は,リエントラントではありません。

[使用例]

#include    <stdlib.h>
void func(long ret) {
    char    *p;
    ret = strtol("10", &p, 0);      /*retに10を返す*/
    ret = strtol("0x10", &p, 0);    /*retに16を返す*/
    ret = strtol("10x", &p, 2);     /*retに2を返し,pの領域には‘x’へのポインタを格納*/
    ret = strtol("2ax3", &p, 16);   /*retに42を返し,pの領域には‘x’へのポインタを格納*/
      :
}