c_str使用规范

来源:互联网 发布:神知结局形象 编辑:程序博客网 时间:2024/06/03 22:58
假设我要使用一个别人写好的f(char *)函数,但是我只有一个string对象 string s="hello"
因为f的参数类型是char*, 而s的类型是string,那该怎么办呢?
好在string类提供了一个c_str函数,能够返回底层的char*指针
所以我们打算这样用:f(s.c_str())
但是这是错误的,因为c_str返回的是一个const char * 类型,而f的参数是char*类型。
所以必须进行强制转换:f( (char*)s.c_str() );


但是这样做是有危险的,因为f并未保证不修改该字符串。


假设我们有一个const的string的话
const string cs = "world";
f( (char*)cs.c_str() );
那么cs的内容将可能被修改,显然违被了我们的本意。


所谓的稳妥办法也就是将s的内容拷贝一份
string s = "hello";
char * scopy = new char[s.size()];
strcpy(scopy, s.c_str());
f(scopy);


如果f的定义很规范的话,f在不修改字符串的情况下会被声明为 f(const char *)
那么可以直接这样使用: f(s.c_str()), 这样就不必进行(char*)转换了


你可以看一下c++标准库里字符串相关函数的声明,
凡是不修改内容的地方一律声明为const char *, 这就叫规范
strlen(const char *)
strcmp(const char *, const char *)
strcpy(char *, const char *)//第一个参数会被修改