C++中string做函数传递参数的危险问题

许多人会遇到这样的问题,自己做的程序要调用别人的函数、类什么的(比如数据库连接函数Connect(char*,char*)),但别人的函数参数用的是char*形式的,而我们知道,c_str()、data()返回的字符数组由该字符串拥有,所以是一种const char*,要想作为上面提及的函数的参数,还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。那么,这时候我们的处理方式是:如果此函数对参数(也就是char*)的内容不修改的话,我们可以这样Connect((char*)UserID.c_str(), (char*)PassWD.c_str()),但是这时候是存在危险的,因为这样转换后的字符串其实是可以修改的(有兴趣地可以自己试一试),所以我强调除非函数调用的时候不对参数进行修改,否则必须拷贝到一个char*上去。当然,更稳妥的办法是无论什么情况都拷贝到一个char*上去。同时我们也祈祷现在仍然使用C字符串进行编程的高手们写的函数都比较规范,那样我们就不必进行强制转换了。

假设我要使用一个别人写好的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()+1];
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 *)//第一个参数会被修改  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值