说明:
- 第1节可以进行进制间的数据类型转换
- 第3节有字符串拆分方法
1. string与C++标准类型(C++11)
C++11提供了string类型转换的函数,在头文件string中(参考官网)。这种方式方便简单,所以放在第一位介绍。
该方法可以进行string和2进制、8进制、16进制的转换。
具体转换函数如下:
函数 | 说明 |
---|---|
stoi | string转int |
stol | string转long int |
stoul | string转unsigned int |
stoll | string转long long |
stoull | string转unsigned long long |
stof | string转float |
stod | string转double |
stold | string转long double |
to_string | numerical(数值类型)转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();