跳到主要内容

C++ strtoull() 函数

C++ 中的 strtoull() 函数将字符串的内容解释为指定基数的整数,并以无符号长长整型(unsigned long long int)的形式返回其值。

如果字符串中存在有效字符之后的字符,此函数还会设置一个指针指向字符串中最后一个有效字符之后的第一个字符;否则,指针被设置为 null。

**对于基数 10 和字符串 "41aac"**

有效的数字部分 -> 42
有效数字部分之后的第一个字符 -> a

strtoull() 函数原型 [C++ 11 标准起]

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

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

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

strtoull() 参数

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

strtoull() 返回值

strtoull() 函数返回:

  • 从字符串转换的无符号长长整型值。
  • 如果无法进行有效转换,则返回 0。

示例 1:strtoull() 函数如何工作?

#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

int main()
{
int base = 10;
char numberString[] = "231ax12";
char *end;
unsigned long long int number;

number = strtoull(numberString, &end, base);
cout << "字符串值 = " << numberString << endl;
cout << "无符号长长整型值 = " << number << endl;
cout << "结束字符串 = " << end << endl;

strcpy(numberString, "231");
cout << "字符串值 = " << numberString << endl;
number = strtoull(numberString, &end, base);
cout << "无符号长长整型值 = " << number << endl;
if (*end) {
cout << end;
} else {
cout << "空指针";
}
return 0;
}

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

字符串值 = 231ax12
无符号长长整型值 = 231
结束字符串 = ax12
字符串值 = 231
无符号长长整型值 = 231
空指针
```对于 `strtoull()` 函数,有效的整数值包括:

- 可选的正(+)或负(-)符号。
- 八进制基数的前缀 0 (仅在基数为 80 时适用)。
- 十六进制基数的前缀 0x 或 0X (仅在基数为 160 时适用)。
- 数字和/或字母的序列(如果基数大于 10)。

如果参数开头包含负号(-),负数会隐式地转换为 `unsigned long long int` 类型的正数。

参数 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} 等等。

## 示例 2:不同基数的 strtoull() 函数

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

int main()
{
char *end;

cout << "148ax" << " 转换为基数为5的无符号长长整型 = " << strtoll("148ax", &end, 5) << endl;
cout << "结束字符串 = " << end << endl << endl;

cout << "148ax" << " 转换为基数为15的无符号长长整型 = " << strtoll("148ax", &end, 15) << endl;
cout << "结束字符串 = " << end << endl << endl;

cout << "148ax" << " 转换为基数为35的无符号长长整型 = " << strtoll("148ax", &end, 35) << endl;
cout << "结束字符串 = " << end << endl << endl;

return 0;
}

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

148ax 转换为基数为5的无符号长长整型 = 9
结束字符串 = 8ax

148ax 转换为基数为15的无符号长长整型 = 4405
结束字符串 = x

148ax 转换为基数为35的无符号长长整型 = 1682308
结束字符串 =

strtoull() 函数会忽略所有开头的空白字符,直到找到第一个非空白字符。

一般来说,对于 strtoull() 函数,有效的整数参数形式为:

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

然后,从这个字符开始,它会尽可能多地取组成有效整数表示的字符,并将它们转换为 long long int 值。字符串中最后一个有效字符之后的剩余部分被忽略,对结果无影响。

示例 3:有前导空白、负号和无效转换的 strtoull() 函数

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

int main()
{
char *end;

cout << " 25axbz" << " 转换为基数为11的无符号长长整型 = " << strtoull(" 25axbz", &end, 11) << endl;
cout << "结束字符串 = " << end << endl << endl;

/* 负值转换为无符号长长整型 */
cout << " -110bcd" << " 转换为基数为2的无符号长长整型 = " << strtoull(" -110bcd", &end, 2) << endl;
cout << "结束字符串 = " << end << endl << endl;

cout << "ax110.97" << " 转换为基数为10的无符号长长整型 =

" << strtoull("ax110.97", &end, 10) << endl;
cout << "结束字符串 = " << end << endl << endl;

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

```cpp
25axbz 转换为无符号长长整型,基数-11 = 307
结束字符串 = xbz

-110bcd 转换为无符号长长整型,基数-2 = 18446744073709551610
结束字符串 = bcd

ax110.97 转换为无符号长长整型,基数-10 = 0
结束字符串 = ax110.97

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

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

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

int main()
{
char *end;

/* 八进制基数 */
cout << "017x" << " 转换为无符号长长整型,基数-0 = " << strtoull("017x", &end, 0) << endl;
cout << "结束字符串 = " << end << endl << endl;

/* 十六进制基数 */
cout << "0x1cg" << " 转换为无符号长长整型,基数-0 = " << strtoull("0x1cg", &end, 0) << endl;
cout << "结束字符串 = " << end << endl << endl;

/* 十进制基数 */
cout << "70sxz" << " 转换为无符号长长整型,基数-0 = " << strtoull("70sxz", &end, 0) << endl;
cout << "结束字符串 = " << end << endl << endl;

return 0;
}

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

017x 转换为无符号长长整型,基数-0 = 15
结束字符串 = x

0x1cg 转换为无符号长长整型,基数-0 = 28
结束字符串 = g

70sxz 转换为无符号长长整型,基数-0 = 70
结束字符串 = sxz