函数
<cstdlib>

strtol

long int strtol (const char* str, char** endptr, int base);
将字符串转换为长整型
解析 C 字符串 str,将其内容解释为指定 base(基数)的整数,并返回一个 long int 类型的值。如果 endptr 不是空指针,则函数还会设置 endptr 的值,使其指向数字之后的第一个字符。

该函数首先丢弃尽可能多的空白字符,直到找到第一个非空白字符。然后,从该字符开始,根据 base 参数的语法规则,取用尽可能多的有效字符,并将它们解释为一个数值。最后,一个指向 str 中整数表示之后第一个字符的指针,将被存储在 endptr 所指向的对象中。

如果 base 的值为零,则预期的语法与整型常量的语法相似,由以下部分依次构成:
  • 一个可选的符号字符(+-
  • 一个可选的、用于指示八进制或十六进制基数的前缀(分别为 "0""0x"/"0X"
  • 一串十进制数字(如果未指定基数前缀),或者一串八进制或十六进制数字(如果存在特定前缀)

如果 base 的值在 2 到 36 之间,则预期的整数格式是一串表示指定基数整数所必需的有效数字和/或字母(从 '0' 开始,对于 36 进制则一直到 'z'/'Z')。该序列前可以有一个可选的符号(+-),并且如果 base 是 16,则可以有一个可选的 "0x""0X" 前缀。

如果 str 中的第一个非空白字符序列不是如上定义的有效整数,或者因为 str 为空或只包含空白字符而导致不存在这样的序列,则不执行任何转换。

对于 "C" 区域设置以外的区域,可能会接受其他形式的主题序列。

参数

str
以整数表示开头的 C 字符串。
endptr
char* 类型对象的引用,其值由函数设置为 str 中数值之后的下一个字符。
该参数也可以是一个空指针,此时它将不被使用。
base
决定有效字符及其解释的数字基数(radix)。
如果此值为 0,则使用的基数由序列中的格式决定(见上文)。

返回值

成功后,函数返回转换后的整数,类型为 long int
如果无法执行有效的转换,则返回零值 (0L)。
如果读取的值超出了 long int 类型可表示的范围,函数将返回 LONG_MAXLONG_MIN(定义于 <climits>),并且 errno 会被设置为 ERANGE

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* strtol example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* strtol */

int main ()
{
  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
  char * pEnd;
  long int li1, li2, li3, li4;
  li1 = strtol (szNumbers,&pEnd,10);
  li2 = strtol (pEnd,&pEnd,16);
  li3 = strtol (pEnd,&pEnd,2);
  li4 = strtol (pEnd,NULL,0);
  printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
  return 0;
}

输出

The decimal equivalents are: 2001, 6340800, -3624224 and 7340031


数据竞争

str 指向的数组被访问,endptr 指向的指针被修改(如果非空)。

异常 (C++)

无异常保证:此函数从不抛出异常。

如果 str 没有指向一个有效的 C 字符串,或者 endptr 没有指向一个有效的指针对象,将导致未定义行为

另见