好的,我用C已经3年了。 我的专业是嵌入式系统工程 几天前我对图像处理很感兴趣。 所以我正在学习C ++。
我想在使用复制构造函数时更改最后一个字符。 喜欢这些 - > Cannon1 Cannon2 Cannon3(Cannon只是名字) 所以我像在C中一样使用了指针。
Photon_Cannon::Photon_Cannon(int x, int y, char *cannon_name)
{
int i = 0;
hp = shield = 100;
coord_x = x;
coord_y = y;
damage = 20;
name = new char[strlen(cannon_name) + 1];
strcpy(name, cannon_name);
}
这是原始代码(这可以正常工作)
我附加了复制构造函数部分的一些代码。
while (*name!=NULL) {
name++;
}
*name+=1;
但它不起作用! :(
帮帮我......
答案 0 :(得分:2)
尝试使用std::string
代替char*
。
Photon_Cannon::Photon_Cannon(int x, int y, const std::string& cannon_name)
将成员变量name
更改为std::string
,然后您可以轻松指定字符串
name = cannon_name;
然后更改最后一个字符
name[name.length() - 1] = '2';
或者
name.pop_back();
name += "2";
不要忘记包含字符串。
或者使用char *
name[strlen(name) - 1] = '2';
别忘了检查数组/字符串的大小,name.length() > 0)
,(int)strlen(name)> 1,......
我建议你阅读一些c ++教程 C++ strings
Iam new on stackoverflow,所以我希望它能帮到你:)。
答案 1 :(得分:0)
这不是作为答案,只是作为菲利普已经给出答案的旁注(以及那里的评论):
void f(std::string const& s)
这是传递std :: string对象的通常的方法,因为它避免了创建(花费运行时和内存)的不必要的副本。如果您确实想要修改字符串(对于传递给f
的字符串对象,可以看到更改),请不要使用const修饰符。
现在我们有一个特例:
void f(std::string const& s)
{
std::string ss(s); // creates a COPY!
// modify the copy ss...
}
显然,要修改副本,但传递给原始字符串对象的更改不可见。如果我们不再需要访问原始字符串(s
), ,那么 和 仅 然后,按值传递字符串是有意义的:
void f(std::string /*const&*/ s) // creates the COPY already when passing
{
/* std::string ss(s); // creates a COPY! */ // <- don't need it any more
// modify the COPY s now...
}
附注:真正留下const引用作为上面的评论(/*const&*/
)将表达(并且应该足够)通过值传递故意 ......