strtolのヘルプ・マニュアル
日本語 英語
strtol --help
man strtol
STRTOL(3) Linux Programmer’s Manual STRTOL(3)
名前
strtol, strtoll, strtoq - 文字列を long int に変換する
書式
#include
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; or 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 が対応していない値である。
ERANGE 結果の値が範囲外である。
実装によっては、変換が行われなかった場合 (数字がなく、0 を返した場合)、
errno に EINVAL が設定される場合がある。
準拠
strtol() は SVr4, 4.3BSD, C89, C99 と POSIX.1-2001 に準拠し て い る 。
strtoll() は C99 と POSIX.1-2001 に準拠している。
注意
strtol () からは成功、失敗どちらの場合でも 0, LONG_MAX, LONG_MIN (str-
toll() では LLONG_MAX, LLONG_MIN) が返る可能性があるので、プログラム は
関 数を呼び出す前に errno を 0 に設定し、呼び出し後に errno が 0 以外の
値かどうかを確認しエラーが発生したかどうかを判断する必要がある。
"C" 以外のロケールの場合、その他の文字列も受け付けられるかもしれない 。
(例えば、現在のロケールの 1000 毎の区切り文字がサポートされているかもし
れない。)
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
#include
#include
#include
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)
GNU 2007-07-26 STRTOL(3)
STRTOL(3) Linux Programmer’s Manual STRTOL(3)
NAME
strtol, strtoll, strtoq - convert a string to a long integer
SYNOPSIS
#include
long int strtol(const char *nptr, char **endptr, int base);
long long int strtoll(const char *nptr, char **endptr, int base);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
strtoll(): XOPEN_SOURCE >= 600 || _BSD_SOURCE || _SVID_SOURCE ||
_ISOC99_SOURCE; or cc -std=c99
DESCRIPTION
The strtol() function converts the initial part of the string in nptr
to a long integer value according to the given base, which must be
between 2 and 36 inclusive, or be the special value 0.
The string may begin with an arbitrary amount of white space (as deter-
mined by isspace(3)) followed by a single optional '+' or '-' sign. If
base is zero or 16, the string may then include a "0x" prefix, and the
number will be read in base 16; otherwise, a zero base is taken as 10
(decimal) unless the next character is '0', in which case it is taken
as 8 (octal).
The remainder of the string is converted to a long int value in the
obvious manner, stopping at the first character which is not a valid
digit in the given base. (In bases above 10, the letter 'A' in either
upper or lower case represents 10, 'B' represents 11, and so forth,
with 'Z' representing 35.)
If endptr is not NULL, strtol() stores the address of the first invalid
character in *endptr. If there were no digits at all, strtol() stores
the original value of nptr in *endptr (and returns 0). In particular,
if *nptr is not '\0' but **endptr is '\0' on return, the entire string
is valid.
The strtoll() function works just like the strtol() function but
returns a long long integer value.
RETURN VALUE
The strtol() function returns the result of the conversion, unless the
value would underflow or overflow. If an underflow occurs, strtol()
returns LONG_MIN. If an overflow occurs, strtol() returns LONG_MAX.
In both cases, errno is set to ERANGE. Precisely the same holds for
strtoll() (with LLONG_MIN and LLONG_MAX instead of LONG_MIN and
LONG_MAX).
ERRORS
EINVAL (not in C99) The given base contains an unsupported value.
ERANGE The resulting value was out of range.
The implementation may also set errno to EINVAL in case no conversion
was performed (no digits seen, and 0 returned).
CONFORMING TO
strtol() conforms to SVr4, 4.3BSD, C89, C99 and POSIX.1-2001, and str-
toll() to C99 and POSIX.1-2001.
NOTES
Since strtol() can legitimately return 0, LONG_MAX, or LONG_MIN
(LLONG_MAX or LLONG_MIN for strtoll()) on both success and failure, the
calling program should set errno to 0 before the call, and then deter-
mine if an error occurred by checking whether errno has a non-zero
value after the call.
In locales other than the "C" locale, other strings may also be
accepted. (For example, the thousands separator of the current locale
may be supported.)
BSD also has
quad_t strtoq(const char *nptr, char **endptr, int base);
with completely analogous definition. Depending on the wordsize of the
current architecture, this may be equivalent to strtoll() or to str-
tol().
EXAMPLE
The program shown below demonstrates the use of strtol(). The first
command-line argument specifies a string from which strtol() should
parse a number. The second (optional) argument specifies the base to
be used for the conversion. (This argument is converted to numeric
form using atoi(3), a function that performs no error checking and has
a simpler interface than strtol().) Some examples of the results pro-
duced by this program are the following:
$ ./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
Program source
#include
#include
#include
#include
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);
}
SEE ALSO
atof(3), atoi(3), atol(3), strtod(3), strtoul(3)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
GNU 2007-07-26 STRTOL(3)