zoukankan      html  css  js  c++  java
  • C++标准库里自带的数值类型和字符串互相转换函数

    需要包含头文件

    #include <string>

    数值类型转成string类型:

    string to_string(int val);

    string to_string(unsigned val);

    string to_string(long val);

    string to_string(unsigned long val);

    string to_string(long long val);

    string to_string(unsigned long long val);

    string to_string(float val);

    string to_string(double val);

    string to_string(long double val);

    string类型转成数值类型:

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

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

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

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

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

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

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

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

    这些函数忽略str开头的空白,pos参数保存已处理的字符个数,如果是nullptr则忽略,base参数为数的底,进制数,默认为10。

    比如

    const std::string str = " 123$ is enough";
    size_t pos = 0;
    int num = std::stoi(str, &pos, 10);
    std::cout << str.c_str() + pos << std::endl;

    将输出 $ is enough ,num值为123,pos值为4。

    C++17添加了更高效的数值和字符串转换函数,在头文件<charconv>中,这些函数内部没有内存申请开销,和区域无关(locale-independent)。

    整形类型转成字符串:

    to_chars_result  to_chars(char* first, char* last, IntegerT value, int base = 10);

    此函数为模版函数,IntegerT为整形类型或char类型,first, last为调用者提供的用于存储转换结果的连续内存区间。

    函数返回类型为

    struct to_chars_result {
    char* ptr;
    errc ec; //type: enum class errc
    };

    如果转换成功的话,ptr为最后一个写入字符的下一个字符的地址,ec值等于std::errc()。转换不成功的话,ptr值为last。

    例子:

    std::string strNum(16, ' ');
    auto [ptr, ec] = std::to_chars(strNum.data(), strNum.data() + strNum.size(), 123);
    
    if (ec == std::errc())
    {
        //successful
        std::cout << strNum << std::endl;
    }
    else
    {
        //failed
    }
    auto [ptr, ec]为C++17中的结构化绑定用法,转换后strNum值为"123",ptr值为strNum.data() + 3。


    浮点数转成字符串:

    to_chars_result to_chars(char* first, char* last, FloatT value);
    to_chars_result to_chars(char* first, char* last, FloatT value, chars_format format);
    to_chars_result to_chars(char* first, char* last, FloatT value, chars_format format, int precision);

    FloatT可以是 float, double, 或 long double 类型,format 类型为 chars_format ,可以是下列值的组合,默认值为 chars_format::general。

    enum class chars_format {
        scientific,                  // Style: (-)d.ddde±dd
        fixed,                       // Style: (-)ddd.ddd
        hex,                         // Style: (-)h.hhhp±d (Note: no 0x!)
        general = fixed | scientific
    };

    字符串转为数值类型:

    from_chars_result from_chars(const char* first, const char* last, IntegerT& value, int base = 10);
    from_chars_result from_chars(const char* first, const char* last, FloatT& value, chars_format format = chars_format::general);

    first, last为被转换的字符串的开始和结束地址,IntegerT为整形类型,FloatT为浮点数类型。

    from_chars_result 类型为:

    struct from_chars_result {
        const char* ptr;
        errc ec;
    };

    转换成功的话ec值等于std::errc(),ptr 值为第一个不能被转换字符的地址,如果字符串都能被转换的话,ptr 值为 last.

    如果是字符串表示的实际值超出 IntegerT 或 FloatT 的区间,ec值为 std::errc::result_out_of_range。

    如果转换失败,ec值为 std::errc::invalid_argument, ptr 值为 first。

    另外注意:from_chars 不会跳过字符串开头的空白。

     

     

     

  • 相关阅读:
    转载文章----.NET 框架浅析
    转载文章----IL反编译利器——Ildasm.exe和Reflector.exe:
    转载文章----初识Ildasm.exe——IL反编译的实用工具
    北航物理实验
    计算机组成原理往年试题以及答案(tzf!!!)
    Java 往年试卷参考答案!!!
    算法导论期末考试英文练习题带答案!!!
    算法导论( FFT & 自动机 & 最优二叉搜索树 !!!)
    Java部分总结图片版2(已加上原图链接!!!)
    Java部分总结图片版(已经加上原图链接下载!!!)
  • 原文地址:https://www.cnblogs.com/Yinkaisheng/p/11096159.html
Copyright © 2011-2022 走看看