将一个常量cstring附加到我自己的String类对象

Appending a constant cstring to my own String class object

本文关键字:我自己 自己的 String 对象 cstring 常量 一个      更新时间:2023-10-16

我正在编写自己的String类,但append函数有问题。它将一个连续的cstring作为参数,并将其附加在调用它的String的末尾

该功能具有以下原型:

void append(char *str );

预期工作:

String s1("John");
s1.append(" Doe");
s1.display();

结果应该是:

John Doe

我得到了什么

John

我在做什么

  • char*data是我的String类的数据成员。

    1. 数据的内容复制到临时中。

    2. 重新定义大小等于temp+CStringToBeAppended+1 的数据

    3. 现在,将temp的内容复制到新的数据中。

    4. CStringToBeAppended的内容复制到新的数据中,从strlen(temp)开始。

这是我迄今为止拥有的功能:

//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] != ''; i++)
temp[i] = data[i];
len = strlen(temp) + strlen(str);
data = new char [len+1];
for (int i=0; temp[i] != ''; i++)
data[i] = temp[i];
for (int i=strlen(temp); str[i] != ''; i++)
data[i] = str[i];

delete [] temp;
}

您的代码对传入的数据字符串进行了不必要的复制,通过终止逻辑进行复制进一步增强了这一功能。这就是你想要做的。

假设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移动数据更是如此,因为您已经知道了长度。否则,你的阑尾只不过是画家施莱梅尔打扮成一个花哨的班级。下面是使用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. Null在复制数据后终止temp
  2. 使用变量j作为data的起点。用strlen分配j(临时)
  3. data的起始位置由i替换为j++
void stringx::appendx(char* str)
{
int x = strlen(data);
char *temp = new char[strlen(data)+1];
int i;
for ( i=0; data[i] != ''; i++)
temp[i] = data[i];
temp[i] = '';                             //<----Change 1
len = strlen(temp) + strlen(str);
data = new char [len+1];
memset(data,0,strlen(data)+1);
for (int i=0; temp[i] != ''; i++)
data[i] = temp[i];
int j=strlen(temp);                        //<----Change 2
for (int i=0; str[i] != ''; i++)
data[j++] = str[i];                    //<----Change 3

delete [] temp;
}