函式
<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 沒有指向一個有效的指標物件,將導致未定義行為

另見