當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ strtol()用法及代碼示例


C++ 中的strtol() 函數將字符串的內容解釋為指定基數的整數,並將其值返回為 long int.

C++ 中的strtol() 函數將字符串的內容解釋為指定基數的整數並將其值返回為 long int. 此函數還設置一個指針,指向最後一個有效字符之後的第一個字符如果有任何字符串,則指針設置為空。

For base 10 and the string "12abc":
Valid numeric part -> 12
First character after valid numeric part -> a

strtol() 原型 [從 C++ 11 標準開始]

long int strtol(const char* str, char** end, int base);

strtol() 函數接受字符串、指向字符的指針和整數值 - 基數作為其參數,將字符串的內容解釋為給定基數的整數並返回一個 long int 值。

該函數在<cstdlib> 頭文件中定義。

參數:

  • str: 具有整數表示的字符串。
  • end: 對已分配的 char* 類型對象的引用。 end 的值由函數設置為 str 中最後一個有效字符之後的下一個字符。該參數也可以是空指針,在這種情況下不使用。
  • base: 整數值的基數。 base 的有效值集是 {0, 2, 3, ..., 35, 36}。

返回:

strtol() 函數返回:

  • 一個 long int 值(從字符串轉換而來)。
  • 如果無法執行有效轉換,則為 0。

示例 1:strtol() 如何在 C++ 中工作?

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int base = 10;
    char str[] = "27ab_1x";
    char *end; 
    long int num;
    
    num = strtol(str, &end, base);
    cout << "Number in  String = " << str << endl;
    cout << "Number in Long Int = " << num << endl;
    cout << "End String = " << end << endl << endl;
    
    // the pointer to invalid characters can be null
    strcpy(str, "27");
    cout << "Number in  String = " << str << endl;
    num = strtol(str, &end, base);
    cout << "Number in Long Int = " << num << endl;
    if (*end) {
        cout << end;
    } else {
        cout << "Null pointer";
    }
    return 0;
}

運行程序時,輸出將是:

Number in  String = 27ab_1x
Number in Long Int = 27
End String = ab_1x

Number in  String = 27
Number in Long Int = 27
Null pointer

strtol() 函數的有效整數值包括:

  • 可選的 + 或 - 符號。
  • 八進製基數的前綴 0(僅在基數 = 8 或 0 時適用)。
  • 十六進製基數的前綴 0x 或 0X(僅在基數 = 16 或 0 時適用)。
  • 一係列數字和/或字母(如果基數大於 10)。

參數 base 的有效值為 {0, 2, 3, ..., 35, 36}。以 2 為底的一組有效數字為 {0, 1},以 3 為底的一組有效數字為 {0, 1, 2},依此類推。對於從 11 到 36 的堿基,有效數字包括字母。以 11 為底的有效數字集是 {0, 1, ..., 9, A, a},以 12 為底的有效數字是 {0, 1, ..., 9, A, a, B, b} 等等。

注意:重要的是要記住,一個堿基的有效字符可能會出現在另一個堿基的無效字符串中,如下例所示。

示例 2:strtol() 具有不同基數的函數

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
    char *end;
    
    cout << "128bz" << " to Long Int with base-5 = " << strtol("128bxz", &end, 5) << endl;
    cout << "End String = " << end << endl << endl;
    
    cout << "128bz" << " to Long Int with base-12 = " << strtol("128bxz", &end, 12) << endl;
    cout << "End String = " << end << endl << endl;
    
    cout << "128bz" << " to Long Int with base-36 = " << strtol("128bxz", &end, 36) << endl;
    cout << "End String = " << end << endl << endl;
    
    return 0;
}

運行程序時,輸出將是:

128bz to Long Int with base-5 = 7
End String = 8bxz

128bz to Long Int with base-12 = 2123
End String = xz

128bz to Long Int with base-36 = 64214135
End String =

strtol() 函數會忽略所有前導空白字符,直到找到主要的非空白字符。

通常,strtol() 函數的有效整數參數具有以下形式:

[whitespace] [- | +] [0 | 0x] [alphanumeric characters]

然後,從這個字符開始,它需要盡可能多的字符來形成一個有效的整數表示並將它們轉換為一個 long int 值。在最後一個有效字符之後字符串的剩餘部分將被忽略並且對結果沒有影響。

示例 3:strtol() 函數用於前導空格和無效轉換

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    char *end;
    
    cout << "  25axbz" << " to Long Int with base-11 = " << strtol("  25axbz", &end, 11) << endl;
    cout << "End String = " << end << endl << endl;
    
    cout << "   110bcd" << " to Long Int with base-2 = " << strtol("   110bcd", &end, 2) << endl;
    cout << "End String = " << end << endl << endl;

    cout << "ax110.97" << " to Long Int with base-10 = " << strtol("ax110.97", &end, 10) << endl;
    cout << "End String = " << end << endl << endl;

    return 0;
}

運行程序時,輸出將是:

  25axbz to Long Int with base-11 = 307
End String = xbz

   110bcd to Long Int with base-2 = 6
End String = bcd

ax110.97 to Long Int with base-10 = 0
End String = ax110.97

如果基數為 0,則通過查看字符串的格式自動確定數字基數。如果前綴為 0,則基數為八進製 (8)。如果前綴為 0x 或 0X,則基數為十六進製 (16),否則基數為十進製 (10)。

示例 4:strtol() 以 0 為基數的函數

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char *end;
    
    /* octal base */
    cout << "0128ai" << " to Long Int with base-0 = " << strtol("0128ai", &end, 0) << endl;
    cout << "End String = " << end << endl << endl;
    
    /* hexadecimal base */
    cout << "0x15axzz" << " to Long Int with base-0 = " << strtol("0x15axzz", &end, 0) << endl;
    cout << "End String = " << end << endl << endl;
    
    /* decimal base */
    cout << "23dfl" << " to Long Int with base-0 = " << strtol("23dfl", &end, 0) << endl;
    cout << "End String = " << end << endl << endl;
    
    return 0;
}

運行程序時,輸出將是:

0128ai to Long Int with base-0 = 10
End String = 8ai

0x15axzz to Long Int with base-0 = 346
End String = xzz

23dfl to Long Int with base-0 = 23
End String = dfl

相關用法


注:本文由純淨天空篩選整理自 C++ strtol()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。