跳到主要内容

C++ strtol() 函数

C++ 中的 strtol() 函数将字符串内容解释为指定基数的整数,并返回其作为 long int 类型的值。此函数还会设置一个指针,指向字符串中最后一个有效字符之后的第一个字符,如果存在的话;否则,指针被设置为 null

**对于基数为 10,字符串为 "12abc" 的情况:**
有效数字部分 -> 12
有效数字部分之后的第一个字符 -> a

strtol() 原型 [C++ 11 标准截至]

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

strtol() 函数接受字符串、字符指针和一个整数值 - 基数作为其参数,将字符串内容解释为给定基数的整数,并返回 long int 类型的值。

此函数定义在 <cstdlib> 头文件中。

strtol() 参数

  • str: 表示整数的字符串。
  • end: 指向已分配 char* 类型对象的引用。函数将 end 的值设置为 str 中最后一个有效字符之后的下一个字符。此参数也可以是空指针,在这种情况下不会使用。
  • base: 整数值的基数。基数的有效值集合是 36

strtol() 返回值

strtol() 函数返回:

  • 一个从字符串转换来的 long int 类型的值。
  • 如果无法进行有效转换,则返回 0。

示例 1:C++ 中 strtol() 的工作方式

#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 << "字符串中的数字 = " << str << endl;
cout << "Long Int 类型的数字 = " << num << endl;
cout << "结束字符串 = " << end << endl << endl;

// 指向无效字符的指针可以是 null
strcpy(str, "27");
cout << "字符串中的数字 = " << str << endl;
num = strtol(str, &end, base);
cout << "Long Int 类型的数字 = " << num << endl;
if (*end) {
cout << end;
} else {
cout << "空指针";
}
return 0;
}


当你运行程序时,输出将是:

字符串中的数字 = 27ab_1x
Long Int 类型的数字 = 27
结束字符串 = ab_1x

字符串中的数字 = 27
Long Int 类型的数字 = 27
空指针
```strtol() 函数的有效整数值包括:

- 可选的 +- 符号。
- 前缀 0 表示八进制基数(仅当基数为 80 时适用)。
- 前缀 0x 或 0X 表示十六进制基数(仅当基数为 160 时适用)。
- 一串数字和/或字母(如果基数大于 10)。

参数 base 的有效值为 {0, 2, 3, ..., 35, 36}。对于基数 2 的有效数字是 {0, 1},基数 3{0, 1, 2} 等等。对于从 1136 的基数,有效数字包括字母。基数 11 的有效数字集合是 {0, 1, `…`, 9, A, a},基数 12{0, 1, `…`, 9, A, a, B, b} 等等。

**注意:** 需要记住的是,对于一个基数来说有效的字符可能在另一个基数中是无效的,如下面的示例所示。

## 示例 2strtol() 函数与不同基数

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

int main()
{
char *end;

cout << "128bz" << " 转换为长整数,基数-5 = " << strtol("128bxz", &end, 5) << endl;
cout << "结束字符串 = " << end << endl << endl;

cout << "128bz" << " 转换为长整数,基数-12 = " << strtol("128bxz", &end, 12) << endl;
cout << "结束字符串 = " << end << endl << endl;

cout << "128bz" << " 转换为长整数,基数-36 = " << strtol("128bxz", &end, 36) << endl;
cout << "结束字符串 = " << end << endl << endl;

return 0;
}

当你运行程序时,输出将是:

128bz 转换为长整数,基数-5 = 7
结束字符串 = 8bxz

128bz 转换为长整数,基数-12 = 2123
结束字符串 = xz

128bz 转换为长整数,基数-36 = 64214135
结束字符串 =

strtol() 函数会忽略所有前导空白字符,直到找到第一个非空白字符。

通常,对于 strtol() 函数的有效整数参数格式如下:

[空白字符] [- | +] [0 | 0x] [字母数字字符]

然后,从这个字符开始,它会取尽可能多的字符,以形成一个有效的整数表示,并将它们转换为长整型值。字符串中在最后一个有效字符之后的部分将被忽略,并且不会影响结果。

示例 3:strtol() 函数处理前导空白和无效转换

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

int main()
{
char *end;

cout << " 25axbz" << " 转换为长整数,基数-11 = " << strtol(" 25axbz", &end, 11) << endl;
cout << "结束字符串 = " << end << endl << endl;

cout << " 110bcd" << " 转换为长整数,基数-2 = " << strtol(" 110bcd", &end, 2) << endl;
cout << "结束字符串 = " << end << endl << endl;

cout << "ax110.97" << " 转换为长整数,基数-10 = " << strtol("ax110.97", &end, 10) << endl;
cout << "结束字符串 = " << end << endl << endl;

return 0;
}
```当你运行程序时,输出将是:

```cpp
25axbz 转换为基数为11的 Long Int = 307
结束字符串 = xbz

110bcd 转换为基数为2的 Long Int = 6
结束字符串 = bcd

ax110.97 转换为基数为10的 Long Int = 0
结束字符串 = ax110.97

如果基数为 ​0​,则通过查看字符串的格式自动确定数字基数。如果前缀为 0,则基数为八进制(8)。如果前缀为 0x 或 0X,则基数为十六进制(16),否则基数为十进制(10)。

示例 4:基数为 0 的 strtol() 函数

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
char *end;

/* 八进制基数 */
cout << "0128ai" << " 转换为基数为0的 Long Int = " << strtol("0128ai", &end, 0) << endl;
cout << "结束字符串 = " << end << endl << endl;

/* 十六进制基数 */
cout << "0x15axzz" << " 转换为基数为0的 Long Int = " << strtol("0x15axzz", &end, 0) << endl;
cout << "结束字符串 = " << end << endl << endl;

/* 十进制基数 */
cout << "23dfl" << " 转换为基数为0的 Long Int = " << strtol("23dfl", &end, 0) << endl;
cout << "结束字符串 = " << end << endl << endl;

return 0;
}

当你运行程序时,输出将是:

0128ai 转换为基数为0的 Long Int = 10
结束字符串 = 8ai

0x15axzz 转换为基数为0的 Long Int = 346
结束字符串 = xzz

23dfl 转换为基数为0的 Long Int = 23
结束字符串 = dfl