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 表示八进制基数(仅当基数为 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() 函数与不同基数
```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