std::stoul(String to Unsigned Long)是 c++ 标准库中的一个字符串转换函数,它用于将std::stringstd::wstring转换为unsigned long类型的整数,并支持不同进制的转换(如二进制、十进制、十六进制等)。

1.std::stoul的基本介绍

std::stoul定义在<string>头文件中,并位于std命名空间下。它的主要功能是将字符串转换为unsigned long类型的整数,并且支持不同进制的转换

1.1std::stoul的函数原型

unsigned long stoul(const std::string& str, size_t* pos = nullptr, int base = 10);
unsigned long stoul(const std::wstring& str, size_t* pos = nullptr, int base = 10);

1.2 参数解析

  • str:要转换的字符串,必须是有效的无符号整数格式。
  • pos(可选):如果提供posstoul会在*pos中存储转换结束的位置(即最后一个转换的字符的下一个位置)。
  • base(可选):表示字符串所使用的进制,默认值为10(十进制),支持236进制。

1.3 返回值

  • 成功:返回转换后的unsigned long类型整数。
  • 失败:如果字符串不是有效的数字或超出了unsigned long类型的范围,会抛出异常。

2.std::stoul的实现原理

在 GCC 标准库的<string>头文件中,std::stoul的底层实现基于std::strtoul,如下:

inline unsigned long
stoul(const string&amp; __str, size_t* __idx = 0, int __base = 10)
{
return __gnu_cxx::__stoa(&amp;std::strtoul, "stoul", __str.c_str(),
__idx, __base);
}

2.1 解析实现代码

  • 调用std::strtoulstd::strtoul(String to Unsigned Long)是 C 语言中的标准库函数,它可以将 C 风格的字符串转换为unsigned long类型的整数,同时支持进制转换。
  • 使用__gnu_cxx::__stoa进行封装__stoa是 GNU C++ 扩展库中的一个工具函数,它用于将unsigned long转换为unsigned long,并进行错误检查。
  • __str.c_str()std::string.c_str()方法返回一个const char*,将std::string转换为 C 风格字符串,以便std::strtoul解析。

3.std::stoul的实际用法

3.1 基础示例

#include <iostream>
#include <string>
int main() {
std::string str = "123456789";
unsigned long num = std::stoul(str);  // 默认10进制
std::cout << "转换结果: " << num << std::endl;
return 0;
}

输出:

转换结果: 123456789

3.2 使用pos参数记录转换结束的位置

#include <iostream>
#include <string>
int main() {
std::string str = "12345xyz";
std::size_t pos;
unsigned long num = std::stoul(str, &pos);
std::cout << "转换结果: " << num << std::endl;
std::cout << "转换结束位置: " << pos << std::endl;
return 0;
}

输出:

转换结果: 12345
转换结束位置: 5

解析:

  • stoul解析"12345"后遇到"xyz",停止转换,并将pos设为5

3.3 处理不同进制的转换

#include <iostream>
#include <string>
int main() {
std::string str = "1A";  // 16进制
unsigned long num = std::stoul(str, nullptr, 16);  // 以16进制解析
std::cout << "转换结果: " << num << std::endl;
return 0;
}

输出:

转换结果: 26

解析:

  • 1A在十六进制中等于26,所以stoul返回26

其他进制示例

std::stoul("1010", nullptr, 2);  // 以二进制解析,返回 10
std::stoul("75", nullptr, 8);    // 以八进制解析,返回 61
std::stoul("1F", nullptr, 16);   // 以十六进制解析,返回 31

4. 处理异常情况

4.1 输入不是有效的数字

如果str不是有效的整数格式,std::stoul会抛出std::invalid_argument异常:

#include <iostream>
#include <string>
#include <stdexcept>
int main() {
try {
std::string str = "abc";
unsigned long num = std::stoul(str);
std::cout << "转换结果: " << num << std::endl;
} catch (const std::invalid_argument& e) {
std::cerr << "错误: 无效的数字字符串 -> " << e.what() << std::endl;
}
return 0;
}

输出:

错误: 无效的数字字符串 -> stoul

4.2 数值超出unsigned long范围

如果字符串表示的数值超出unsigned long的范围,std::stoul会抛出std::out_of_range异常:

#include <iostream>
#include <string>
#include <climits>
int main() {
try {
std::string str = "99999999999999999999";
unsigned long num = std::stoul(str);
std::cout << "转换结果: " << num << std::endl;
} catch (const std::out_of_range& e) {
std::cerr << "错误: 数值超出范围 -> " << e.what() << std::endl;
}
return 0;
}

输出:

错误: 数值超出范围 -> stoul

5.std::stoul相关函数

函数 作用 返回类型
std::stoi 转换为int int
std::stol 转换为long long
std::stoll 转换为long long long long
std::stoul 转换为unsigned long unsigned long
std::stoull 转换为unsigned long long unsigned long long

6. 结论

  • std::stoulstd::strtoul的封装,支持进制转换。
  • 提供pos参数记录转换位置。
  • 可能抛出std::invalid_argumentstd::out_of_range异常。
  • 适用于转换无符号整数,如unsigned long,如果数值更大,可以使用std::stoull

到此这篇关于深入解析 C++中std::stoul 函数的文章就介绍到这了,更多相关C++ std::stoul 内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。