ctrl+c / ctrl+v 真是害死人,看起来简单的东西,往往却又很容易出问题
究其原因,还在于只知其表不知其里,容易想当然。
今天遇到的问题是简单调用string::replace替换子串的问题,如:
std::string sTest1 = "12x567890";
std::string sTest2 = sTest1;
std::string sSub = "x";
std::string sRepl = "34";
int index = sTest1.find(sSub.c_str());
sTest1.replace(index, index+strlen(sSub.c_str()), sRepl); // sTest1 == "12347890" 错误,按这种方式抄了下用法
index = sTest2.find(sSub.c_str());
sTest2.replace(index, index+strlen(sSub.c_str()), sRepl.c_str()); // sTest2 == "12347890" 错误
// sTest2.replace(index, strlen(sSub.c_str()), sRepl.c_str()); // sTest2 == "1234567890" 正确
以上sTest2的结果不是想要的,其原因在于函数重载,第三个参数类型不一样前两个参数含义是不一样的。
查看replace实现源码,其功能注释是很清楚的。
看来太习惯于隐式类型转换,如const char* -> string ,不是什么好习惯。
===================写到这里,我发现还在犯错误
标准std::string::replace,sTest1替换的语法应该是通不过的而我能通过是因为用的stlport代替标准库。。。