在C ++中使用strcat函数时遇到问题。
如果我这样做:
MyClass::MyClass(char* myString){
char* AnotherString = myString;
strcat(AnotherString, "bob");
}
然后一切都很好。但是,如果我这样做:
MyClass::MyFunction(){
char* AnotherString = "fred";
strcat(AnotherString, "bob");
}
我在strcat.asm中遇到一个未处理的异常。有什么想法吗?
此致
答案 0 :(得分:8)
是使用C ++:
std::string anotherString = "fred";
anotherString += "bob";
是Let_Me_Be和Moo-Juice所说的,结合起来。
这段代码:
char* anotherString = "fred";
非常危险,应该尽量避免。 fred
存储在内存的只读部分中,无法更改 - 出于所有实际目的,它基本上与const char*
相同。请注意,char anotherString[] = "fred";
是一个完全不同的故事,因为它实际上存储了fred
的副本,可以随意修改。
然而,正如Moo-Juice指出的那样,strcat
将第二个参数连接在第一个之后,这意味着第一个字符串必须有足够的分配空间来容纳它们。因此,在您的情况下,char anotherString[] = "fred";
对您没有好处,因为anotherString
只有5个字节长。然后你应该写:
char anotherString[8] = "fred"; // fred + bob + 1
strcat(anotherString, "bob");
当然,在现实世界中,您可能不会提前知道字符串大小,因此您可以使用malloc
来分配充足的缓冲区。
答案 1 :(得分:7)
strcat(dest, src)
中“dest”指向的缓冲区必须足够大以容纳结果字符串。所以:
char* anotherString = "fred"; // 5 bytes including zero-terminator
例如,没有“鲍勃”的空间。
但是,你已经用C ++发布了这个,那你为什么还要使用strcat()?
#include <string>
std::string another = "fred";
another.append("bob");
答案 2 :(得分:1)
首先,编译器不应该允许你编译它(没有警告):
char* str = "fred";
正确的代码是:
const char* str = "fred";
字符串文字是常量,因此您无法修改其内容。