我有下面的功能定义
void ConvertString(std::string &str)
{
size_t pos = 0;
while ((pos = str.find("&", pos)) != std::string::npos) {
str.replace(pos, 1, "and");
pos += 3;
}
}
此功能的目的是找到&并用和替换它。函数执行很好。我在一个实例中为所有通用字符串写了这个,我按照以下方式调用它
char mystr[80] = "ThisIsSample&String";
ConvertString((std::string)mystr);
printf(mystr);
在上面的调用中,我希望控制台应该使用“and”打印出新的修改后的字符串。 但是一些字符串修改不起作用,函数中有任何错误吗?
答案 0 :(得分:4)
此代码:
char mystr[80] = "ThisIsSample&String";
ConvertString((std::string)mystr);
printf(mystr);
...创建一个临时字符串对象并将其作为参数传递。
由于形式参数类型是通过引用非const
,因此不应该编译,但Visual C ++支持它作为语言扩展(仅适用于类类型,IIRC)。
而是喜欢
string s = "Blah & blah";
ConvertString( s );
cout << s << endl;
顺便说一下,C风格的演员阵容通常都是对bug的邀请,因为这种演员阵容的基本性质可能会非常默默地改变。
}代码维护时const_cast
到reinterpret_cast
。
在经验丰富的程序员手中足够安全,像链锯等电动工具可以安全地掌握在经验丰富的樵夫手中,但新手应该只是为了节省一点工作而不是一件事
答案 1 :(得分:2)
这是因为您创建了一个临时std::string
对象(其初始内容是数组mystr
的内容),并通过引用该函数传递该临时对象。然后,当呼叫ID完成时,该临时对象被破坏。
答案 2 :(得分:1)
您是否阅读过std::string和printf的一些文档?
你需要
std::string mystr = "ThisIsSample&String";
ConvertString(mystr);
printf(mystr.c_str());
您显然希望将引用字符串变量(技术上为l-value)传递给您的ConvertString
答案 3 :(得分:1)
我相信你的问题是你将char数组转换为字符串。
ConvertString((std::string)mystr);
此行创建一个std :: string类型的新变量,并通过引用传递它。你想要的是这样转换它:
std::string convertedStr = (std::string)mystr;
ConvertString(convertedStr);
printf(convertedStr.c_str());
我不太了解C ++指针和引用语法,但它与此类似
答案 4 :(得分:0)
你在做什么是不正确的!你不能不应该使用cstyle-cast将char*
转换为std::string
。你应该做的更像是:
std::string mystr( "ThisIsSample&String" );
ConvertString(mystr);
编辑: thx for -reputation ...这段代码甚至没有编译...... http://ideone.com/bCsmgf