名 前
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_MIN と LONG_MAX の 代 わ り に LLONG_MIN と LLONG_MAX が 返 さ れ る 。
エ ラ ー
EINVAL |
(C99 に は な い ) 指 定 さ れ た base が サ ポ ー ト さ れ て い な い 値 で あ る 。 結 果 の 値 が 範 囲 外 で あ る 。 実 装 に よ っ て は 、 変 換 が 行 わ れ な か っ た 場 合 (数 字 が な く 、 0 を 返 し た 場 合 )、 errno に EINVAL が 設 定 さ れ る 場 合 が あ る 。 属 性マ ル チ ス レ ッ デ ィ ン グ (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 #include <stdlib.h> int if (argc <
2) { str = argv[1];
errno = 0; /*
To distinguish success/failure after call */ /* Check for various possible errors */ if ((errno ==
ERANGE && (val == LONG_MAX || val == LONG_MIN)) if (endptr ==
str) { /* If we got here, strtol() successfully parsed a number */ printf("strtol() returned %ld\n", val); if (*endptr !=
'\0') /* Not necessarily an error... */ 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/ に 書 か れ て い る 。 |