Manpages

名 前

strtol, strtoll, strtoq − 文 字 列 を long int に 変 換 す る

書 式

#include <stdlib.h>

long int strtol(const char *nptr, char **endptr, int base);

long long int strtoll(const char *nptr, char **endptr, int base);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

strtoll():

XOPEN_SOURCE >= 600 || _BSD_SOURCE || _SVID_SOURCE || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L; ま た は cc −std=c99

説 明

strtol() 関 数 は 、 nptr の 文 字 列 の 最 初 の 部 分 を 、 base を 基 数 と し て long int に 変 換 す る 。 こ の base は 2 か ら 36 ま で の 値 あ る い は 特 別 な 意 味 を 持 つ 値 0 で な け れ ば な ら な い 。 文 字 列 の 先 頭 に は 、 任 意 の 数 の 空 白 が あ っ て も よ く (空 白 は isspace(3) で 判 定 さ れ る )、 ま た 数 字 の 直 前 に は '+' か '−' の 符 号 が あ っ て も よ い 。 base が 0 ま た は 16 の 場 合 に は 、 文 字 列 の 先 頭 に "0x" を 置 く こ と が で き 、 そ の 場 合 に は 文 字 列 は 16進 数 と し て 扱 わ れ る 。 こ れ 以 外 の 文 字 列 で base が 0 の 場 合 は 、 文 字 列 が '0' で 始 ま る と き は 8進 数 と し て 、 そ れ 以 外 の と き は 10進 数 と し て 扱 わ れ る 。 数 字 を 表 す 文 字 列 は long int に 変 換 さ れ る が 、 基 数 に 対 し て 有 効 で な い 数 字 が 現 れ た 時 点 で 変 換 は 終 了 す る 。 (11進 数 以 上 で は 'A' は 大 文 字 ・ 小 文 字 に 関 わ ら ず 10 を 表 し 、 'B' は 11 を 表 現 し 、 以 下 同 様 に 、 'Z' は 35 を 表 す 。 )

endptr が ヌ ル 値 (NULL) で な い 場 合 は 、 最 初 に 現 れ た 不 正 な 文 字 が strtol() に よ っ て *endptr に 保 存 さ れ て い る 。 文 字 列 に 有 効 な 数 字 が ひ と つ も な け れ ば 、 strtol() は nptr の 元 の 値 を *endptr に 代 入 す る (そ し て 0 を 返 す )。 特 に 、 *nptr が '\0' 以 外 で 、 返 さ れ た **endptr が '\0' な ら ば 、 文 字 列 全 体 が 有 効 だ っ た こ と に な る 。

strtoll() 関 数 は strtol() と 同 様 だ が 、 long long int 型 の 値 を 返 す 。

返 り 値

ア ン ダ ー フ ロ ー も オ ー バ ー フ ロ ー も 起 き な か っ た 場 合 、 strtol() 関 数 は 変 換 さ れ た 値 を 返 す 。 オ ー バ ー フ ロ ー し た 場 合 に は LONG_MAX が 返 り 、 ア ン ダ ー フ ロ ー し た 場 合 に は LONG_MIN が 返 る 。 オ ー バ ー フ ロ ー 、 ア ン ダ ー フ ロ ー の い ず れ の 場 合 に も 大 域 変 数 errno に は ERANGE が 設 定 さ れ る 。 strtoll() も 同 様 で あ る が 、 LONG_MINLONG_MAX の 代 わ り に LLONG_MINLLONG_MAX が 返 さ れ る 。

エ ラ ー

EINVAL

(C99 に は な い ) 指 定 さ れ た base が サ ポ ー ト さ れ て い な い 値 で あ る 。

ERANGE

結 果 の 値 が 範 囲 外 で あ る 。 実 装 に よ っ て は 、 変 換 が 行 わ れ な か っ た 場 合 (数 字 が な く 、 0 を 返 し た 場 合 )、 errnoEINVAL が 設 定 さ れ る 場 合 が あ る 。

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 strtol(), strtoll(), strtoq() は 、 例 外 付 き の ス レ ッ ド セ ー フ で あ る 。 実 行 中 に setlocale(3) を 呼 び 出 し て ロ ケ ー ル を 変 更 し な い 限 り 、 マ ル チ ス レ ッ ド ア プ リ ケ ー シ ョ ン で 安 全 に 使 用 す る こ と が で き る 。

準 拠

strtol() は SVr4, 4.3BSD, C89, C99 と POSIX.1−2001 に 準 拠 し て い る 。 strtoll() は C99 と POSIX.1−2001 に 準 拠 し て い る 。

注 意

strtol () か ら は 成 功 、 失 敗 ど ち ら の 場 合 で も 0, LONG_MAX, LONG_MIN (strtoll() で は LLONG_MAX, LLONG_MIN) が 返 る 可 能 性 が あ る の で 、 プ ロ グ ラ ム は 関 数 を 呼 び 出 す 前 に errno を 0 に 設 定 し 、 呼 び 出 し 後 に errno が 0 以 外 の 値 か ど う か を 確 認 し エ ラ ー が 発 生 し た か ど う か を 判 断 す る 必 要 が あ る 。

POSIX.1−2001 で は 、 "C" と "POSIX" 以 外 の ロ ケ ー ル で は 、 こ れ ら の 関 数 は 、 他 の 実 装 時 に 定 義 さ れ る 数 字 を 示 す 文 字 列 を 受 け 付 け る と さ れ て い る 。

BSD に は 、

quad_t strtoq(const char *nptr, char **endptr, int base); と い う 完 全 に 同 様 の 定 義 を 持 つ 関 数 が あ る 。 使 用 中 の ア ー キ テ ク チ ャ ー の ワ ー ド 長 次 第 で あ る が 、 こ の 関 数 は strtoll() か strtol() と 等 価 と な る こ と も あ る 。

以 下 の プ ロ グ ラ ム は strtol() の 使 用 例 で あ る 。 最 初 の コ マ ン ド ラ イ ン 引 き 数 に は strtol() が 数 字 と し て 解 釈 す る 文 字 列 を 指 定 す る 。 (省 略 可 能 な ) 二 番 目 の 引 き 数 に は 変 換 に 使 用 さ れ る 基 数 を 指 定 す る (こ の 引 き 数 は atoi(3) を 使 っ て 数 値 に 変 換 さ れ る 。 atoi(3)strtol() よ り も 簡 単 な イ ン タ ー フ ェ ー ス を 持 つ 関 数 で 、 そ の 中 で は エ ラ ー チ ェ ッ ク は 行 わ れ な い )。 こ の プ ロ グ ラ ム の 実 行 例 を い く つ か 以 下 に 示 す :

$ ./a.out 123
strtol() returned 123
$ ./a.out ' 123'
strtol() returned 123
$ ./a.out 123abc
strtol() returned 123
Further characters after number: abc
$ ./a.out 123abc 55
strtol: Invalid argument
$ ./a.out ''
No digits were found
$ ./a.out 4000000000
strtol: Numerical result out of range プ ロ グ ラ ム の ソ ー ス

#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <errno.h>

int
main(int argc, char *argv[])
{
int base;
char *endptr, *str;
long val;

if (argc < 2) {
fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
exit(EXIT_FAILURE); }

str = argv[1];
base = (argc > 2) ? atoi(argv[2]) : 10;

errno = 0; /* To distinguish success/failure after call */
val = strtol(str, &endptr, base);

/* Check for various possible errors */

if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
|| (errno != 0 && val == 0)) {
perror("strtol");
exit(EXIT_FAILURE); }

if (endptr == str) {
fprintf(stderr, "No digits were found\n");
exit(EXIT_FAILURE); }

/* If we got here, strtol() successfully parsed a number */

printf("strtol() returned %ld\n", val);

if (*endptr != '\0') /* Not necessarily an error... */
printf("Further characters after number: %s\n", endptr);

exit(EXIT_SUCCESS); }

関 連 項 目

atof(3), atoi(3), atol(3), strtod(3), strtoul(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。