我正在编写自己的String类,并且在append函数中遇到问题。它将一个包含cstring的参数作为参数,并将其附加在String调用它的末尾。
该函数具有以下原型:
void append(char *str );
预期工作:
String s1("John");
s1.append(" Doe");
s1.display();
结果应为:
John Doe
我得到了什么?
John
我在做什么?
char * data是我的String类的数据成员。
将数据的内容复制到 temp 。
重新声明大小等于temp + CStringToBeAppended + 1的数据
现在,将 temp 的内容复制到新的数据。
从 strlen(temp)的位置开始,将 CStringToBeAppended 的内容复制到新的数据。
这是我到目前为止的功能:
//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;
}
答案 0 :(得分:2)
您的代码会对传入数据字符串进行不必要的复制,并通过复制终止逻辑进一步增强。这就是你要做的。
假设data
不 null且 正确地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
移动数据更是如此,因为您已经知道了长度。否则你的追加只不过是Schlemiel the Painter装扮成一个花哨的课程。使用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;
}
答案 1 :(得分:0)
我做了一些改动
Null
终止temp
j
作为data
的起点。用strlen(temp)分配j data
的{{1}}替换为j++
的<{1}}
醇>
i