通过引用传递char数组并返回修改

时间:2014-08-27 06:49:04

标签: c++

我有下面的功能定义

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”打印出新的修改后的字符串。 但是一些字符串修改不起作用,函数中有任何错误吗?

5 个答案:

答案 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_castreinterpret_cast

在经验丰富的程序员手中足够安全,像链锯等电动工具可以安全地掌握在经验丰富的樵夫手中,但新手应该只是为了节省一点工作而不是一件事

答案 1 :(得分:2)

这是因为您创建了一个临时std::string对象(其初始内容是数组mystr的内容),并通过引用该函数传递该临时对象。然后,当呼叫ID完成时,该临时对象被破坏。

答案 2 :(得分:1)

您是否阅读过std::stringprintf的一些文档?

你需要

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