实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
2017-08-18 21:15
609 查看
在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型:
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串同样.
这就看到了吧,返回值是const char*,这里须要注意一下。
1 string转const char*
当然是用到上面所述的方法c_str():
还有还有一种方法:
data():与c_str()相似。可是返回的数组不以空字符终止。
2 string转char*
能够使用strcpy:
也能够使用copy:
3 const char*转string
4 char*转string
简单了:
================================================================
上面提到了data和c_str的差别,那么到底差别在哪呢?
二者原型:
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()函数干什么?看看源代码:
原来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()得到字符串,每调用一次。下次再使用就会失效,如:
会遇到什么错误?当你幸运的时候pstr可能仅仅是指向”this is Winter Hello!”的字符串,假设不幸运。就会导致程序出现其它问题,总会有一些不可遇见的错误。
总之不会是你预期的那个结果。
const char *c_str();
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串同样.
这就看到了吧,返回值是const char*,这里须要注意一下。
1 string转const char*
当然是用到上面所述的方法c_str():
string s1 = "abcdeg"; const char *k = s1.c_str(); cout<<k<endl;
还有还有一种方法:
data():与c_str()相似。可是返回的数组不以空字符终止。
2 string转char*
能够使用strcpy:
string s = "what fucking day"; char* c; constint len = s.length(); c =newchar[len+1]; strcpy(c,s.c_str());
也能够使用copy:
int main() { std::string foo("quuuux"); char bar[7]; foo.copy(bar, sizeof bar); bar[6] = '\0'; std::cout << bar << '\n'; }
3 const char*转string
4 char*转string
简单了:
char* c ="abc"; string s(c);
================================================================
上面提到了data和c_str的差别,那么到底差别在哪呢?
二者原型:
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!”的字符串,假设不幸运。就会导致程序出现其它问题,总会有一些不可遇见的错误。
总之不会是你预期的那个结果。
相关文章推荐
- 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
- 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
- (c++) int 转 string,char*,const char*和string的相互转换
- 实战c++中的string系列--std:vector<char> 和std:string相互转换(vector to stringstream)
- (c++) int 转 string,char*,const char*和string的相互转换
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等----留着备用
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date
- C/C++中的char*,const char*,string之间转换
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等 .
- 如何从string 转换为const char *和char * (附带string中c_str()、data()、copy(p,n)函数的用法)
- c++中string、const char*和char*之间的相互转换
- 实战c++中的string系列--std:vector<char> 和std:string相互转换(vector to stringstream)
- c++中的一些类型转换 : CString,string,int ,long,double,char*,const char*,date等
- 实战c++中的string系列--std:vector<char> 和std:string相互转换(vector to stringstream)
- 【C++】char*,const char*,string的相互转换
- char*,const char*和string 三者转换及区别
- VC中int,char,char*,const char*,string等类型转换
- char*,const char*和string的相互转换
- C++ char*,const char*,string的相互转换