我正在编写自己的 String 类,并且在使用追加函数时遇到问题。它接受一个常量 cstring 作为参数,并将其 append 到调用它的 String 的末尾。
该函数具有以下原型(prototype):
void append(char *str );
预期工作:
String s1("John");
s1.append(" Doe");
s1.display();
结果应该是:
John Doe
我得到了什么?
John
我在做什么?
char * data 是我的 String 类的数据成员。
将data的内容复制到temp中。
重新声明大小等于 temp+CStringToBeAppend+1 的数据
现在,将 temp 的内容复制到新的data中。
从 strlen(temp) 位置开始,将 CStringToBeAppend 的内容复制到新的 data 中。
这是我到目前为止的功能:
//char * data is the data member of my String class.
void append(char* str)
{
char *temp = new char[strlen(data)+1];
for (int i=0; data[i] != '\0'; i++)
temp[i] = data[i];
len = strlen(temp) + strlen(str);
data = new char [len+1];
for (int i=0; temp[i] != '\0'; i++)
data[i] = temp[i];
for (int i=strlen(temp); str[i] != '\0'; i++)
data[i] = str[i];
delete [] temp;
}
最佳答案
您的代码对传入数据字符串进行不必要的复制,并通过复制终止逻辑进一步增强。这就是您正在尝试做的事情。
假设data
不为空并且正确地以0结尾:
void append(const char *str)
{
if (!(str && *str))
return;
char *final = new char[ strlen(str) + strlen(data) + 1 ], *dst = final;
// copy in lhs
const char *src = data;
while (*src)
*dst++ = *src++;
// copy in rhs
while (*str)
*dst++ = *str++;
*dst = 0;
// swap pointers
std::swap(data, final);
// throw out prior result
delete [] final;
}
并且您可以通过在 data
成员 (data_len
) 的分配大小中保留一个单独的成员,从而显着提高效率。更重要的是使用 std::copy() 或 memcpy 来移动数据,因为您已经知道长度。否则你的 append 只不过是 Schlemiel the Painter穿着华丽的类(class)。下面是使用 std::copy()
的修改版本。我将管理 data_len
成员以及 data
的工作交给您
void append(const char *str)
{
if (!(str && *str))
return;
size_t dlen = strlen(data);
size_t slen = strlen(str);
char *final = new char[ dlen + slen + 1 ];
std::copy(data, data+dlen, final);
std::copy(str, str+slen+1, final+dlen);
std::swap(data,final);
delete [] final;
}
关于c++ - 将常量 cstring append 到我自己的 String 类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21930820/