STRTOL - Linux手册页
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)。
Interface | Attribute | Value |
strtol(),strtoll(),strtoq() | Thread safety | MT-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); }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。