我正在尝试创建自己的字符串类,并且我正在尝试创建构造函数。到目前为止,我有点挣扎。
我在头文件中定义了我的函数原型,并在头文件中定义了变量缓冲区,如char *buffer;
,在一个新的cpp文件中,我试图像这样定义构造函数:
mystring::mystring(const char *s)
{
int counter = strlen(s)+1;
*buffer = generate_c_array(counter);
}
char * mystring::generate_c_array(int size)
{
return new char[size];
}
我基本上试图使buffer
是一个大小为s+1
的char数组,并包含s
后跟空终止符的内容。但是,这导致我的程序崩溃。
我不确定如何正确分配缓冲区,这看起来是否正确?
答案 0 :(得分:2)
您可以简单地编写代码
mystring::mystring(const char *s)
{
sz = strlen(s) // sz- another data member, holds size
buffer = new char[sz + 1];
strcpy(buffer, s); // assuming s is null-terminated
}
for循环和计数器实际上不是必需的
答案 1 :(得分:1)
您已分配给buffer
中的特定字符,而不是变量buffer
。改为:
buffer = generate_c_array(counter);
除此之外,strdup
将为您执行相同的工作,但您必须使用free()
取消分配。在当前的代码中,您实际上并没有真正复制,除非使用前面提到的strcpy(buffer, s)
,否则您必须执行strdup
。
答案 2 :(得分:0)
为什么要循环遍历字符串std::size_t length = strlen(s);
buffer = generate_c_array(length + 1);
// Copy your string:
memcpy(buffer, s, length)
// Add the terminator character:
buffer[length] = '\0';
的长度?
如果您需要字符串的长度,请直接使用它:
https://github.com/socketio/engine.io
transports (<Array> String): transports to allow connections to (['polling', 'websocket'])
答案 3 :(得分:0)
new
给你的指针),则不需要*
。strncpy
为您复制。mystring::mystring(const char *s)
{
int counter = strlen(s)+1;
char* buffer = generate_c_array(counter);
strncpy(buffer, s, counter);
}
char * mystring::generate_c_array(int size)
{
return new char[size];
}