STRTOL - Linux手册页

时间:2019-08-20 18:01:26  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

strtol,strtoll,strtoq-将字符串转换为长整数

语法

#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():

_ISOC99_SOURCE || / * Glibc版本

说明

strtol()函数根据给定的基数将nptr中字符串的初始部分转换为长整数值,该值必须介于2到36之间(含2和36),或者为特殊值0。

该字符串可以以任意数量的空格(由isspace(3)确定)开头,后跟一个可选的aq + aq或aq-aq符号。如果base为零或16,则字符串可以包含" 0x"或" 0X"前缀,并且该数字将以16为底数;否则,除非下一个字符是aq0aq,否则零基将被视为10(十进制),在这种情况下,它将被视为8(八进制)。

字符串的其余部分以明显的方式转换为long int值,停在给定基数中不是有效数字的第一个字符处。 (在大于10的基数中,大写或小写字母aqAaq代表10,aqBaq代表11,依此类推,aqZaq代表35。)

如果endptr不为NULL,则strtol()将第一个无效字符的地址存储在* endptr中。如果根本没有数字,strtol()会将nptr的原始值存储在* endptr中(并返回0)。特别是,如果返回时* nptr不是aq \ 0aq,而** endptr是aq \ 0aq,则整个字符串都是有效的。

strtoll()函数的工作原理与strtol()函数类似,但是返回一个long long整数值。

返回值

strtol()函数返回转换结果,除非该值下溢或上溢。如果发生下溢,strtol()返回LONG_MIN。如果发生溢出,strtol()返回LONG_MAX。在这两种情况下,errno都设置为ERANGE。对于strtoll()完全相同(使用LLONG_MIN和LLONG_MAX代替LONG_MIN和LONG_MAX)。

错误说明

EINVAL
(不在C99中)给定的基数包含不受支持的值。
ERANGE
所得值超出范围。

如果未执行转换(未看到数字,则返回0),该实现还可以将errno设置为EINVAL。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
strtol(),strtoll(),strtoq()Thread safetyMT-Safe locale

遵循规范

strtol():POSIX.1-2001,POSIX.1-2008,C89,C99 SVr4、4.3BSD。

strtoll():POSIX.1-2001,POSIX.1-2008,C99。

备注

由于成功和失败时strtol()都可以合法地返回0,LONG_MAX或LONG_MIN(对于strtoll()来说,LLONG_MAX或LLONG_MIN),因此调用程序应在调用之前将errno设置为0,然后通过检查是否发生错误来进行检查调用后errno的值非零。

根据POSIX.1,在" C"和" POSIX"以外的语言环境中,这些函数可以接受其他实现定义的数字字符串。

BSD也有

quad_t strtoq(const char *nptr, char **endptr, int base);

具有完全相似的定义。根据当前体系结构的大小,这可能等效于strtoll()或strtol()。

示例

下面显示的程序演示了strtol()的用法。第一个命令行参数指定一个字符串,strtol()应该从该字符串中解析一个数字。第二个(可选)参数指定要用于转换的基数。 (此参数使用atoi(3)转换为数字形式,该函数不执行错误检查,并且比strtol()具有更简单的接口。)以下是此程序产生的结果的一些示例:

$ ./a.out 123
strtol() returned 123
$ ./a.out aq    123aq
strtol() returned 123
$ ./a.out 123abc
strtol() returned 123
Further characters after number: abc
$ ./a.out 123abc 55
strtol: Invalid argument
$ ./a.out aqaq
No digits were found
$ ./a.out 4000000000
strtol: Numerical result out of range

Program source

#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 != aq##代码##aq)        /* Not necessarily an error... */
        printf("Further characters after number: %s\n", endptr);

    exit(EXIT_SUCCESS);
}

另外参见

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

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/