C言語編 標準ライブラリのリファレンス strtol

先頭へ戻る

strtol関数

概要 文字列を long型に変換する。
ヘッダ stdlib.h
形式 long int strtol(const char* s, char** endptr, int radix);
引数 s 対象の文字列。
endptr 変換できない最初の文字へのポインタを受け取るポインタ。不要であれば、ヌルポインタでも構わない。
radix 2~36 の範囲の基数。または 0。
戻り値 正常に変換された場合は、long型に変換された結果。
変換結果が、表現可能な範囲を超えている場合は、正しい結果が正ならば LONG_MAX、負ならば LONG_MIN が返される。
最初の文字の時点ですでに変換不能な場合、0 が返される。
詳細 引数radix が 2~36 のいずれかであれば、s を radix で指定した基数の整数とみなし、long型の値として返す。引数radix が 0 の場合には、先頭にある "0" や "0x"、"0X" という文字の並びに応じて、8進数、10進数、16進数のいずれかであるとみなし、やはり long型の値として返す。
数として認識できない文字に行き当たると、その文字を指すポインタを引数endptr が指すポインタに渡す。引数endptr がヌルポインタの場合は、単に変換をその段階で中止する。
s の先頭に空白類文字が並んでいるとき、それらは無視される。続いて、符号 "+" や "-" があっても構わない。なお、整数リテラルの末尾に付ける L や u のようなサフィックスは認識しない。
変換結果が、表現可能な範囲を超えている場合、errnoERANGE が格納される。
注意 エラーの有無は errno によって調べなければならない。正常な変換によって 0 が得られる可能性があるため、戻り値だけで判定することは不可能である。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
    const char* str = "3050abc";
    long l;
    char* s = NULL;

    errno = 0;
    l = strtol( str, &s, 10 );
    if( (l == LONG_MIN || l == LONG_MAX) && errno == ERANGE ){
        fputs( "結果が表現できない\n", stderr );
        exit( EXIT_FAILURE );
    }
    else if( str == s ){
        fputs( "変換できなかった\n", stderr );
        exit( EXIT_FAILURE );
    }

    printf( "%ld\n", l );
    if( s != NULL ){
        puts( s );
    }

    return 0;
}

実行結果:

3050
abc
関連 strtod関数は double型に、strtoul関数は unsigned long型に変換できる。また、atoi関数atol関数atof関数は、それぞれ仕様が単純だが、エラー検出が行えない。
C99 の場合には更に、float型に変換する strtof関数、long double型に変換する strtold関数、long long型に変換する strtoll関数がある。
解説章 第45章


参考リンク

更新履歴

'2018/4/20 「NULL」という表記を「ヌルポインタ」に修正。

'2018/4/17 全体的に文章を見直し修正。

'2018/1/22 新規作成。





標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS