添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
完美的充值卡  ·  <algorithm> 函式 | ...·  1 周前    · 
悲伤的熊猫  ·  React ...·  1 周前    · 
爱旅游的红烧肉  ·  OpenCV4 ...·  6 天前    · 
淡定的冰淇淋  ·  SyntaxError: missing ...·  4 天前    · 
坚强的伤痕  ·  mongodb 使用mongodump备份 ...·  11 月前    · 

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

1. string转vector<char>

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

#include <vector>
#include <iostream>
#include <string>
using namespace std;
int main(void)
	string str = "Hello world";
	cout<<"str: length="<<str.length()<<endl;
	cout<<"-----------"<<endl;
    //定义vector的同时用string初始化
	vector<char> vec0(str.begin(), str.end());  
	//vec0.emplace_back('\0');
	cout<<"vec0: size="<<vec0.size()<<"  data="<<vec0.data()<<endl;
	cout<<"-----------"<<endl;
    vector<char> vec1;
    /*...*/
    //先定义vector, 再通过assign()利用string初始化	
	vec1.assign(str.begin(), str.end());  
	//vec1.emplace_back('\0');
	cout<<"vec1: size="<<vec1.size()<<"  data="<<vec1.data()<<endl;
	cout<<"-----------"<<endl;
	//用string的首地址+length的方式初始化vector
	vector<char> vec2(str.data(), str.data()+str.length());	
	//vec2.emplace_back('\0');
	cout<<"vec2: size="<<vec2.size()<<"  data="<<vec2.data()<<endl;
    //当然上面的方法中都可以使用string的指定部分给vector赋值,比如
    vector<char> vec3{str.begin()+1, str.begin()+5};
    cout<<"vec3: size="<<vec3.size()<<" data=";
    for(auto i:vec3){
        std::cout<<i;
    std::cout<<"\n";
    //当然,如果想通过vec.data输出的话,因为其操作的是char *类型的指针,所以还是需要在vec3的最后添加一个字符串结束符
    vec3.emplace_back('\0');
	cout<<"vec3="<<vec3.data()<<std::endl;
    return 0;

vector<char>加了'\0'的输出结果:

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

2. char *转vector<char>

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

#include <vector>
#include <iostream>
#include <string.h>
using namespace std;
int main(void)
	const char *buf = "Hello world";
	cout<<"str: length="<<strlen(buf)<<endl;
	cout<<"-----------"<<endl;
	//定义vector<char>的同时初始化
	vector<char> vec1(buf, buf+strlen(buf));
	vec1.emplace_back('\0');
	cout<<"vec1: size="<<vec1.size()<<"  data="<<vec1.data()<<endl;
	cout<<"-----------"<<endl;
	//先定义vector<char>, 后通过assign()填充数据
	vector<char> vec2;
	vec2.assign(buf, buf+strlen(buf));
	vec2.emplace_back('\0');
	cout<<"vec2: size="<<vec2.size()<<"  data="<<vec2.data()<<endl;
    return 0;

 vector<char>加了'\0'的输出结果:

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

 3. vector<char>转string

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

#include <vector>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int main(void)
	const char *buf = "Hello world";
	vector<char> vec1(buf, buf+strlen(buf));
	//vector最后没有存入'\0',但是创建string时指定了size,就不会有问题
	string str1(vec1.data(), vec1.size()); 
	cout<<"str1: size="<<str1.size()<<"  data="<<str1<<endl;
	cout<<"-----------"<<endl;
	//如果vector最后存入了'\0',那么用vector初始化string时,可以不指定vector的size
	vector<char> vec2(buf, buf+strlen(buf));
	vec2.emplace_back('\0');
	string str2(vec2.data()); 
	cout<<"str2: size="<<str2.size()<<"  data="<<str2<<endl;
    cout<<"-----------"<<endl;
    //当然也可以使用vector的部分给string 赋值
    vector<char> 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="<<str3<<endl;
    cout<<"\n";
    return 0;

上述代码运行结果:

如果vector<char>的最后没有 '\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 <vector>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int main(void)
	const char *buf = "Hello world";
	string str = buf;
	cout<<"str:"<<buf<<endl;
	string str1("hello");   //string str1{"hello"};  也可以
	const char *buf1;
	buf1 = str1.c_str();
	cout<<"buf1="<<buf1<<endl;
	char *buf2;
	buf2 = const_cast<char *>(str1.c_str()); //通过const_cast完成非const到const的转换
	cout<<"buf2="<<buf1<<endl;
    return 0;

5.其它说明

5.1在vector和string中使用 {} 和 () 的说明

() 会调用构造函数,{}是列表初始化,也会调用构造函数,在一些场景中使用二者其一都可以,如下:

std::string str{"Hello"};  和  std::string str("Hello");  都ok。

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

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

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

大致思路: 倒序遍历string,将每个字符装入vector&lt; char &gt; #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string.h&gt; using namespace std; /* run this program using the console pauser or add your ...
原文:《C++ Primer》//无法使用string对象初始化C风格的字符串指针 string st2; char *str=st2; //error//可以使用string类的成员函数c_str(),返回指向字符数组首地址的指针,并以结束符null结束 char *str=st2.c_str(); //almost ok,but not quite //c_str返回的指针指向c
// vector&lt;char&gt;, string转换 // vector&lt;char&gt;与string本质上都是STL内部的程序,是可以用insert来转换的 #include &lt;bits/stdc++.h&gt; // c++标准库 using namespace std ; int m...
1、注意,与char*不同的是,string不一定以NULL('\0')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。 2、stringconst char * 如果要将string直接转换const char *类型。string有2个函数可以运用。 一个是.c_str(),一个是data成
很多函数都涉及到文件路径,但是他们需要const char *类型,下面总结了两个方法,很给力哦! 用string.c_str()是将string类型的转换const char *类型 const_cast 1. stringconst char*   string s = "abc";   const char* c_s = s.c_str();2. const c