c++11 标准模板(STL)string(十五)

string 类型转数值

定义于头文件 <string>

int 、long 、long、unsigned  long、unsigned long long、float、double 、long double

转换字符串为有符号整数

c++ 11起

int       stoi( const std::string& str, std::size_t* pos = 0, int base = 10 );
int       stoi( const std::wstring& str, std::size_t* pos = 0, int base = 10 ); 

long      stol( const std::string& str, std::size_t* pos = 0, int base = 10 );
long      stol( const std::wstring& str, std::size_t* pos = 0, int base = 10 );

long long stoll( const std::string& str, std::size_t* pos = 0, int base = 10 );
long long stoll( const std::wstring& str, std::size_t* pos = 0, int base = 10 );

转译字符串 str 中的有符号整数值。

1) 调用 std::strtol(str.c_str(), &ptr, base) 或 std::wcstol(str.c_str(), &ptr, base)

2) 调用 std::strtol(str.c_str(), &ptr, base) 或 std::wcstol(str.c_str(), &ptr, base)

3) 调用 std::strtoll(str.c_str(), &ptr, base) 或 std::wcstoll(str.c_str(), &ptr, base)

舍弃所有空白符(以调用 isspace() 鉴别),直到找到首个非空白符,然后取尽可能多的字符组成底 n (其中 n=base )的整数表示,并将它们转换成一个整数值。合法的整数值由下列部分组成:

  • (可选)正或负号
  • (可选)指示八进制底的前缀( 0 )(仅当底为 8 或 ​0​ 时应用)
  • (可选)指示十六进制底的前缀( 0x0X )(仅当底为 16 或 ​0​ 时应用)
  • 一个数字序列

底的合法集是 {0,2,3,...,36} 。合法数字集对于底 2 整数是 {0,1},对于底3整数是 {0,1,2} ,以此类推。对于大于 10 的底,合法数字包含字母字符,从对于底 11 整数的 Aa 到对于底36整数的 Zz 。忽略字符大小写。

当前安装的 C 本地环境可能接受另外的数字格式。

若 base 为 ​0​ ,则自动检测数值进制:若前缀为 0 ,则底为八进制,若前缀为 0x0X ,则底为十六进制,否则底为十进制。

若符号是输入序列的一部分,则对从数字序列计算得来的数字值取反,如同用结果类型的一元减。

pos 不是空指针,则指针 ptr ——转换函数内部者——将接收 str.c_str() 中首个未转换字符的地址,将计算该字符的下标并存储之于 *pos ,该对象给出转换所处理的字符数。

参数

str-要转换的字符串
pos-存储已处理字符数的整数的地址
base-数的底

返回值

对应 str 内容的整数值。

异常

  • 若不能进行转换则为 std::invalid_argument
  • 若转换值会落在结果类型的范围外,或若底层函数( std::strtol 或 std::strtoll )设置 errno 为 ERANGE 则为 std::out_of_range 。

调用示例

    // int 类型
    // str 转10进制
    std::cout << "num int: " << std::dec << std::stoi(str1, &pos)
              << " , pos: " << pos << std::endl;
    pos = 0;
    // str 转8进制,终端显示10进制,8进制
    int numi8 = std::stoi(str2, &pos, 8);
    std::cout << "num int: " << std::dec << numi8
              << " , " << std::oct << numi8;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转16进制,终端显示10进制,16进制
    int numi16 = std::stoi(str3, &pos, 16);
    std::cout << "num int: " << std::dec << numi16
              << " , " << std::hex << numi16;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    std::cout << std::endl;

    // long 类型
    pos = 0;
    std::cout << "num long: " << std::dec << std::stol(str1, &pos)
              << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转8进制,终端显示10进制,8进制
    long numl8 = std::stol(str2, &pos, 8);
    std::cout << "num long: " << std::dec << numl8
              << " , " << std::oct << numl8;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转16进制,终端显示10进制,16进制
    long numl16 = std::stoi(str3, &pos, 16);
    std::cout << "num long: " << std::dec << numl16
              << " , " << std::hex << numl16;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    std::cout << std::endl;

    // long long 类型
    pos = 0;
    std::cout << "num long long: " << std::dec << std::stoll(str1, &pos)
              << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转8进制,终端显示10进制,8进制
    long long numll8 = std::stoll(str2, &pos, 8);
    std::cout << "num long long: " << std::dec << numll8
              << " , " << std::oct << numll8;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转16进制,终端显示10进制,16进制
    long long numll16 = std::stoll(str3, &pos, 16);
    std::cout << "num long long: " << std::dec << numll16
              << " , " << std::hex << numll16;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    std::cout << std::endl;

转换字符串为无符号整数

c++ 11 起

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

转译字符串 str 中的无符号整数值。

1) 调用 std::strtoul(str.c_str(), &ptr, base) 或 std::wcstoul(str.c_str(), &ptr, base)

2) 调用 std::strtoull(str.c_str(), &ptr, base) 或 std::wcstoull(str.c_str(), &ptr, base)

舍弃所有空白符(以调用 isspace() 鉴别),直到找到首个非空白符,然后取尽可能多的字符组成底 n (其中 n=base )的无符号整数表示,并将它们转换成一个整数值。合法的无符号整数值由下列部分组成:

  • (可选)正或负号
  • (可选)指示八进制底的前缀( 0 )(仅当底为 8 或 ​0​ 时应用)
  • (可选)指示十六进制底的前缀( 0x0X )(仅当底为 16 或 ​0​ 时应用)
  • 一个数字序列

底的合法集是 {0,2,3,...,36} 。合法数字集对于底 2 整数是 {0,1},对于底3整数是 {0,1,2} ,以此类推。对于大于 10 的底,合法数字包含字母字符,从对于底 11 整数的 Aa 到对于底36整数的 Zz 。忽略字符大小写。

当前安装的 C 本地环境可能接受另外的数字格式。

若 base 为 ​0​ ,则自动检测数值进制:若前缀为 0 ,则底为八进制,若前缀为 0x0X ,则底为十六进制,否则底为十进制。

若符号是输入序列的一部分,则对从数字序列计算得来的数字值取反,如同用结果类型的一元减,它对无符号整数应用回卷规则。

pos 不是空指针,则转换函数内部的 ptr 指针会接收首个 str.c_str() 中未转换字符的地址,然后该字符的下标在计算后存储于 *pos ,给出转换所处理的字符数。

参数

str-要转换的字符串
pos-存储被处理字符数的整数的地址
base-数字基底

返回值

转换到指定无符号整数类型的字符串。

异常

  • 若不能进行转换则抛出 std::invalid_argument
  • 若转换值会落在转换类型的范围之外,或底层函数( std::strtoul 或 std::strtoull )设 errno 为 ERANGE 则抛出 std::out_of_range 。

调用示例

    // unsigned long 类型
    pos = 0;
    std::cout << "num unsigned long: " << std::dec << std::stoul(str1, &pos)
              << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转8进制,终端显示10进制,8进制
    unsigned long numul8 = std::stoul(str2, &pos, 8);
    std::cout << "num unsigned long: " << std::dec << numul8
              << " , " << std::oct << numul8;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转16进制,终端显示10进制,16进制
    unsigned long numul16 = std::stoul(str3, &pos, 16);
    std::cout << "num unsigned long: " << std::dec << numul16
              << " , " << std::hex << numul16;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    std::cout << std::endl;

    // unsigned long long 类型
    pos = 0;
    std::cout << "num unsigned long long: "
              << std::dec << std::stoull(str1, &pos)
              << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转8进制,终端显示10进制,8进制
    unsigned long long numull8 = std::stoull(str2, &pos, 8);
    std::cout << "num unsigned long long: " << std::dec << numull8
              << " , " << std::oct << numull8;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    pos = 0;
    // str 转16进制,终端显示10进制,16进制
    unsigned long long numull16 = std::stoull(str3, &pos, 16);
    std::cout << "num unsigned long long: " << std::dec << numull16
              << " , " << std::hex << numull16;
    std::cout << " , pos: " << std::dec << pos << std::endl;
    std::cout << std::endl;

转换字符串为浮点值

c++ 11起

float       stof( const std::string& str, std::size_t* pos = 0 );
float       stof( const std::wstring& str, std::size_t* pos = 0 );

double      stod( const std::string& str, std::size_t* pos = 0 );
double      stod( const std::wstring& str, std::size_t* pos = 0 );

long double stold( const std::string& str, std::size_t* pos = 0 );
long double stold( const std::wstring& str, std::size_t* pos = 0 );

转译 string str 中的浮点值。

1) 调用 std::strtod(str.c_str(), &ptr) 或 std::wcstod(str.c_str(), &ptr)

(C++17 前)

1) 调用 std::strtof(str.c_str(), &ptr) 或 std::wcstof(str.c_str(), &ptr)

(C++17 起)

2) 调用 std::strtod(str.c_str(), &ptr) 或 std::wcstod(str.c_str(), &ptr)

3) 调用 std::strtold(str.c_str(), &ptr) 或 std::wcstold(str.c_str(), &ptr)

函数会舍弃任何空白符(由 std::isspace() 确定),直至找到首个非空白符。然后它会取用尽可能多的字符,以构成合法的浮点数表示,并将它们转换成浮点值。合法的浮点值可以为下列之一:

  • 十进制浮点数表达式。它由下列部分组成:
  • (可选) 正或负号
  • 非空的十进制数字序列,可选地包含一个小数点字符(由当前的 C 本地环境确定)(定义有效数字)
  • (可选) eE ,并跟随可选的正或负号,以及非空十进制数字序列(以 10 为底定义指数)
  • 二进制浮点数表达式。它由下列部分组成:
  • (可选) 正或负号
  • 0x0X
  • 非空的十六进制数字序列,选地包含一个小数点字符(由当前的 C 本地环境确定)(定义有效数字)
  • (可选) pP ,并跟随可选的正或负号,以及非空十进制数字序列(以 2 为底定义指数)
  • 无穷大表达式。它由下列部分组成:
  • (可选) 正或负号
  • INFINFINITY ,忽略大小写
  • 非数(NaN)表达式。它由下列部分组成:
  • (可选) 正或负号
  • NANNAN(char_sequence) ,忽略 NAN 部分的大小写。 char_sequence 只能由数字、拉丁字母和下划线构成。结果是一个安静的 NaN 浮点值。
  • 任何其他可由当前 C 本地环境接受的表达式

pos 不是空指针,则对于转换函数为内部的指针 ptr 将接受 str.c_str() 中首个未转换字符的地址,然后计算该字符的下标并存储之于 *pos ,给出转换处理的字符数。

参数

str-要转换的 string
pos-存储已处理字符数的整数的地址

返回值

转换为指定浮点类型的字符串。

异常

若不能进行转换则为 std::invalid_argument 。

若转换后的值会落在结果类型的范围外,或若底层函数( strtof 、 (C++17 起)strtodstrtold )设置 errno 为 ERANGE 则为 std::out_of_range 。

调用示例

    string strf = "123.456";
    //float 类型
    pos = 0;
    float numf = std::stof(strf, &pos);
    std::cout << "num float: " << std::dec << numf
              << " , pos: " << std::dec << pos << std::endl;
    //double 类型
    pos = 0;
    double numd = std::stod(strf, &pos);
    std::cout << "num double: " << std::dec << numd
              << " , pos: " << std::dec << pos << std::endl;
    //long double 类型
    pos = 0;
    long double numld = std::stold(strf, &pos);
    std::cout << "num long double: " << std::dec << numld
              << " , pos: " << std::dec << pos << std::endl;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值