C++中各种数据类型相互转换(string、char*、int、double、2进制、8进制、16进制、stringstream、QString等)

说明:

  • 第1节可以进行进制间的数据类型转换
  • 第3节有字符串拆分方法

1. string与C++标准类型(C++11)

C++11提供了string类型转换的函数,在头文件string中(参考官网)。这种方式方便简单,所以放在第一位介绍。

该方法可以进行string和2进制、8进制、16进制的转换。

具体转换函数如下:

函数说明
stoistring转int
stolstring转long int
stoulstring转unsigned int
stollstring转long long
stoullstring转unsigned long long
stofstring转float
stodstring转double
stoldstring转long double
to_stringnumerical(数值类型)转string
#include <iostream>   // std::cout
#include <string>     // std::string, std::stoi

int main ()
{
    /*************string转换标准类型************/
    std::string str_dec = "2001, A Space Odyssey";
    std::string str_hex = "40c3";
    std::string str_bin = "-10010110001";
    std::string str_auto = "0x7f";
    std::string str_int = "1234 99 100";
    
    std::string::size_type sz;   // alias of size_t
    
    int i_dec = std::stoi (str_dec,&sz);//第一个字符串转换为int,&sz为第一个字符串地址
    int i_hex = std::stoi (str_hex,nullptr,16);//16进制转int,从第0个字符串地址开始
    int i_bin = std::stoi (str_bin,nullptr,2);//2进制转int
    int i_auto = std::stoi (str_auto,nullptr,0);//自动转换成int,根据字符串转换
    int i_int_1 = std::stoi(str_int);//默认为10进制,默认只转换第一个
    int i_int_2 = std::stoi(str_int.substr(sz));//第2个字符串,获得子字符串函数
    //(从size_type开始位置到结束,也就是跳过第一个字符串位置)
    //如果一个字符串里面有很多个数据,则需要采用字符串分割方法(参考本文第三节)
    
    std::cout << str_dec << ": " << i_dec << " and [" << str_dec.substr(sz) << "]\n";
    std::cout << str_hex << ": " << i_hex << '\n';
    std::cout << str_bin << ": " << i_bin << '\n';
    std::cout << str_auto << ": " << i_auto << '\n';
    std::cout <<str_int<<": " <<i_int_1<<std::endl;
    std::cout <<str_int<<": " <<i_int_2<<std::endl;
    
    /***********标准类型转换乘string*************/
    std::string pi = "pi is " + std::to_string(3.1415926);
    std::string perfect = std::to_string(1+2+3+7);
    std::cout<<"string pi: "<<pi<<std::endl;
    std::cout<<"perfect: "<<perfect<<std::endl;
    
    return 0;
}

2. 使用stringsteam和istreamsteam进行数据转换

如果不能使用C++11标准函数转换,可以参考这个方法。stringstream和istringstream包含在头文件sstream中,深入学习可以参考官网

参考代码如下:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main ()
{
    /*************int转string************/
    int aa = 20;
    stringstream ss;
    ss << aa;
    string str = ss.str();

    cout<<str<<endl;
    /***********string转int************/
    istringstream istr("666");
    int i = 0;
    istr >> i;
    cout<<i<<endl;
    return 0;
}

3. string与char*

string是C++标准,而char*是C标准,有时候它们对它们进行相互转换。使用c_str方法进行string转char*,而char*可以直接赋值给string类型。

  • string的c_str和data方法是有区别的,c_str返回的是带’\0’的char*,而data没有。
  • data返回的数组,虽然也是char*类型,但它不是C类型的字符串。
  • string类型也没有’\0’

data():http://www.cplusplus.com/reference/string/string/data/
c_str():http://www.cplusplus.com/reference/string/string/c_str/

参考代码如下:

#include <iostream>
#include <cstring>
#include <string>
using namespace std;

int main ()
{
    /*************string转char* ***********/
    string str = "Please split this sentence into tokens";
    char* cstr = new char[str.length() + 1];
    strcpy(cstr, str.c_str());//C的拷贝函数

    char * p = strtok (cstr," ");//C的分割函数
      while (p!=0)
      {
        cout << p << '\n';
        p = strtok(NULL," ");
      }

      delete[] cstr;
    /***********char*转string************/
      char* ccstr = "I am lucy";//char[]才需要强制加'\0'
      string sstr = ccstr;
      cout<<sstr<<endl;
}

4. string与QString

有时候会用到Qt中的类型,需要对类型进行转换。它的转换也相对简单,参考代码如下:

代码中还使用了char*,

#include <iostream>
#include <string>
#include<QString>
using namespace std;

int main ()
{
    /*************string转QString***********/
    string str = "I am Lucy";
    QString qStr = QString::fromStdString(str);//直接转换
    qStr = QString(str.c_str());//使用char*间接转换

    /***********QString转string************/
    string myName = qStr.toStdString();
}

5. 数字类型与QString

number和arg方法可以应用于int、float和double类型。如果number只有一个参数则默认转换为没有小数点。

//int转QString
int a = 123456;
QString b;
b = QString::number(a,10,5);//QString::number(a,基底,精度)

//double转QString
double a = 123.456;
QString b;
b =  QString::number(a,10,5);//同int

//方法2,利用arg()
int a = 123456;
QString b = QString("%1").arg(a);//""里面还可以添加内容,还可以应用于double

//QString转int
QString c = "123456";
int d;
d = c.toInt();
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值