我正在努力使用C ++通过函数传递参数!
假设以下函数声明:
void functionname (char * myvar) {
char * ptf;
ptf = strtok(myvar,"=");
}
cstring myvar 是通过引用传递的,就像在C ++函数中传递的任何数组一样,对吗?
但是如何制作 myvar 变量的本地副本,我在功能中修改了这个?
问题是使用语句“ptf = strtok(myvar,”=“);”修改myvar!
答案 0 :(得分:1)
首先需要澄清你的意思。
当您说myvar
已通过"通过引用"时,您正在使用C术语。您正在使用引用语义作为字符数组,是的,但您没有通过引用传递。在C ++中,我们有引用类型,我们使用短语"通过引用传递"。这里有一个指针类型。您正在按值传递指针。
现在您要问"如何制作myvar
的本地副本?"如果我按字面解释你的问题,那么它就像做:
char* anothervar = myvar;
我已将myvar
的值复制到anothervar
。然而,他们仍然指向同一个角色。
如果您希望将字符串的内容复制到另一个数组,则需要使用类似strcpy
的内容并执行一些动态分配,但这是非常糟糕的C ++风格。相反,您应该始终使用std::string
。在这样的情况下,你的功能变得更加简单:
void functionname(std::string myvar) {
std::string anothervar = myvar;
}
(虽然从myvar
复制到anothervar
没有充分的理由,因为myvar
已经是传递给它的字符串的副本了)
我最近在avoiding raw pointers上写了一篇文章,其中一个部分涵盖了C风格的字符串以及为什么std::string
更好。
答案 1 :(得分:-1)
cstring
myvar
通过引用传递,就像在C ++函数中传递的任何数组的情况一样,对吧?
没有。在这种情况下,它通过值传递。
但是如何制作myvar变量的本地副本,我在函数内修改了?
void functionname (char * myvar) {
std::string::size_type len = strlen(myvar);
char *temp = new char[len+1];
strcpy(temp, myvar);
temp = strtok(temp, "=");
//....
}