c++中char与string之间的相互转换问题第⼀部分:
将 char * 或者 char [] 转换为 string
可以直接赋值,转换。
第⼆部分:
将 string 转换为 char * 或者 char []
string 是c++标准库⾥⾯其中⼀个,封装了对字符串的操作
把string转换为char* 有 3种⽅法:
1. 调⽤ string 的 data 函数
如:
string str="abc";
char *p=str.data();
2.调⽤ string 的 c_str 函数
如:string str="gdfd";
char *p=str.c_str();
3 调⽤ string 的 copy 函数
⽐如
string str="hello";
char p[40];
cout < <p;
语法:
const char *c_str();
c_str()函数返回⼀个指向正规C字符串的指针, 内容与本string串相同.
这是为了与c语⾔兼容,在c语⾔中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:⼀定要使⽤strcpy()函数等来操作⽅法c_str()返回的指针
⽐如:最好不要这样:
char* c;
string s="1234";
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理
应该这样⽤:
char c[20];
string s="1234";
strcpy(c,s.c_str());
这样才不会出错,c_str()返回的是⼀个临时指针,不能对其进⾏操作
再举个例⼦
c_str() 以 char* 形式传回 string 内含字符串
如果⼀个函数要求char*参数,可以使⽤c_str()⽅法:
string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"
1、如果要将string转换为char*,可以使⽤string提供的函数c_str() ,或是函数data(),data除了返回字符串内容外,不附加结束符'\0',⽽c_str()返回⼀个以‘\0’结尾的字符数组。
2、const char *c_str();
c_str()函数返回⼀个指向正规C字符串的指针,内容与本string串相同.
c++string类型这是为了与c语⾔兼容,在c语⾔中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式.
注意:⼀定要使⽤strcpy()函数等来操作⽅法c_str()返回的指针
⽐如:最好不要这样:
char* c;
string s="1234";
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理
应该这样⽤:
char c[20];
string s="1234";
strcpy(c,s.c_str());
这样才不会出错,c_str()返回的是⼀个临时指针,不能对其进⾏操作
再举个例⼦
c_str() 以 char* 形式传回 string 内含字符串
如果⼀个函数要求char*参数,可以使⽤c_str()⽅法:
string s = "Hello World!";
printf("%s",s.c_str()); //输出 "Hello World!"
1、⾸先必须了解,string可以被看成是以字符为元素的⼀种容器。字符构成序列(字符串)。有时候在字符序列中进⾏遍历,标准的string类提供了STL容器接⼝。具有⼀些成员函数⽐如begin()、end(),迭代器可以根据他们进⾏定位。
注意,与char*不同的是,string不⼀定以NULL('\0')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。
2、string 转换成 char *
如果要将string直接转换成const char *类型。string有2个函数可以运⽤。
⼀个是.c_str(),⼀个是data成员函数。
例⼦如下:
string s1 = "abcdeg";
const char *k = s1.c_str();
const char *t = s1.data();
printf("%s%s",k,t);
cout<<k<<t<<endl;
如上,都可以输出。内容是⼀样的。但是只能转换成const char*,如果去掉const编译不能通过。
那么,如果要转换成char*,可以⽤string的⼀个成员函数copy实现。
string s1 = "abcdefg";
char *data;
int len = s1.length();
data = (char *)malloc((len+1)*sizeof(char));
printf("%s",data);
cout<<data;
3、char *转换成string
可以直接赋值。
string s;
char *p = "adghrtyh";
s = p;
不过这个是会出现问题的。
有⼀种情况我要说明⼀下。当我们定义了⼀个string类型之后,⽤printf("%s",s1);输出是会出问题的。这是因为“%s”要求后⾯的对象的⾸地址。但是string不是这样的⼀个类型。所以肯定出错。
⽤cout输出是没有问题的,若⼀定要printf输出。那么可以这样:
printf("%s",s1.c_str())
备注:
string::c_str()、string::data()的区别:
const value_type *c_str( ) const;
const value_type *data( ) const;
data只是返回原始数据序列,没有保证会⽤traits::eos(),或者说'\0'来作字符串结束. 当然,可能多数实现都这样做了。
c_str是标准的做法,返回的char* ⼀定指向⼀个合法的⽤'\0'终⽌的C兼容的字符串。
所以,如果需要C兼容的字符串,c_str 是标准的做法,data 并不保证所有STL的实现的⼀致性。
你或许会问,c_str()的功能包含data(),那还需要data()函数⼲什么?看看源码:
const charT* c_str () const
{
if (length () == 0)
return "";
terminate ();
return data ();
}
原来c_str()的流程是:先调⽤terminate(),然后在返回data()。因此如果你对效率要求⽐较⾼,⽽且你的处理⼜不⼀定需要以\0的⽅式结束,你最好选择data()。但是对于⼀般的C函数中,需要以const char*为输⼊参数,你就要使⽤c_str()函数。
对于c_str() data()函数,返回的数组都是由string本⾝拥有,千万不可修改其内容。其原因是许多string实现的时候采⽤了引⽤机制,也就是说,有可能⼏个string使⽤同⼀个字符存储空间。⽽且你不能使⽤sizeof(string)来查看其⼤⼩。详细的解释和实现查看Effective STL的条款15:⼩⼼string实现的多样性。
另外在你的程序中,只在需要时才使⽤c_str()或者data()得到字符串,每调⽤⼀次,下次再使⽤就会失效,如:
string strinfo("this is Winter");
...
//最好的⽅式是:
foo(strinfo.c_str());
//也可以这么⽤:
const char* pstr=strinfo.c_str();
foo(pstr);
//不要再使⽤了pstr了, 下⾯的操作已经使pstr⽆效了。
strinfo += " Hello!";
foo(pstr);//错误!
会遇到什么错误?当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有⼀些不可遇见的错误。总之不会是你预期的那个结果。
strcpy
C语⾔标准库函数strcpy,把从src地址开始且含有'\0'结束符的字符串复制 到 以dest开始的地址空间。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论