C++ string、vector<char>和(const)char *之间的转换

写C++程序时经常会遇到string、vector和(const)char *之间的转换,本文介绍了其间的转换方法和注意事项。

1. string转vector

string所存储字符串不包含'\0',所以转为vector后,通过vector.data()直接输出会有问题,会往后找直到'\0',会出现乱码。所以应该在vector后手动再加上'\0',这样在vector.data()输出字符串就没问题了。但此时vector.size()会比string.length()多1(结束符)。

#include 
#include 
#include 

using namespace std;

int main(void)
{
	string str = "Hello world";
	cout<<"str: length="< vec0(str.begin(), str.end());  
	//vec0.emplace_back('\0');
	cout<<"vec0: size="< vec1;
    /*...*/
    //先定义vector, 再通过assign()利用string初始化	
	vec1.assign(str.begin(), str.end());  
	//vec1.emplace_back('\0');
	cout<<"vec1: size="< vec2(str.data(), str.data()+str.length());	
	//vec2.emplace_back('\0');
	cout<<"vec2: size="<C++ string、vector<char>和(const)char *之间的转换_第1张图片

 

结尾没有加'\0'(代码中注释掉emplace_back('\0'))的输出结果:

 C++ string、vector<char>和(const)char *之间的转换_第2张图片

2. char *转vector

与string转为vector是同样的道理,下面的两种方式vector中都只存储了const char *中的数据部分,没有包含字符串的结束符 '\0',如果不收到在vector的后面加上  '\0',通过vector.data()输出字符串就会有问题,同样意味着vector.size会+1。

#include 
#include 
#include 

using namespace std;
int main(void)
{
	const char *buf = "Hello world";
	cout<<"str: length="<的同时初始化
	vector vec1(buf, buf+strlen(buf));
	vec1.emplace_back('\0');
	cout<<"vec1: size="<, 后通过assign()填充数据
	vector vec2;
	vec2.assign(buf, buf+strlen(buf));
	vec2.emplace_back('\0');
	cout<<"vec2: size="<C++ string、vector<char>和(const)char *之间的转换_第3张图片

结尾没有加'\0'(代码中注释掉emplace_back('\0'))的输出结果:

C++ string、vector<char>和(const)char *之间的转换_第4张图片

 3. vector转string

如果vector的最后存入了字符串结束符 '\0',那么用vetor的时候就可以不用指定size,否则就要指定size,不然的话操作string的时候就会出现异常。

#include 
#include 
#include 
#include 

using namespace std;
int main(void)
{
	const char *buf = "Hello world";
	vector vec1(buf, buf+strlen(buf));
	//vector最后没有存入'\0',但是创建string时指定了size,就不会有问题
	string str1(vec1.data(), vec1.size()); 
	cout<<"str1: size="< vec2(buf, buf+strlen(buf));
	vec2.emplace_back('\0');
	string str2(vec2.data()); 
	cout<<"str2: size="< vec3{'H','e','l','l','o',' ','w','o','r','l','d'};
    string str3{vec3.begin(), vec3.begin()+4};  //string str3(vec3.begin(), vec3.begin()+4); 也是正确的
    cout<<"str3="<

上述代码运行结果:

C++ string、vector<char>和(const)char *之间的转换_第5张图片

如果vector的最后没有 '\0',也没有指定size(注释掉vec2.emplace_back('\0');),则程序直行结果为:

  4. (const) char *和string互转

(1)可以用char *或const char *直接过string赋值,char *转string时会报warning。

(2)将string转为const char*: 借助string类的c_str()方法,其返回值是const char *类型,所以不能赋值给char *(在c++中const赋值给非const会报错,需借助const_cast强转)。

#include 
#include 
#include 
#include 

using namespace std;
int main(void)
{
	const char *buf = "Hello world";
	string str = buf;
	cout<<"str:"< 
  

std::vector vec{str.begin(), str.end()}; 和 std::vector vec(str.begin(), str.end());都ok。

std::vector vec1{'H','e','l','l','o'}; ok     std::vector vec2('H','e','l','l','o');  错误

std::string str1(vec1.begin(), vec1.end()); 和 std::string str1{vec1.begin(), vec1.end()}; 都ok。

你可能感兴趣的:(C++,c++)