gpt4 book ai didi

c++ - 将常量 cstring append 到我自己的 String 类对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:56 29 4
gpt4 key购买 nike

我正在编写自己的 String 类,但在使用 append 函数时遇到了问题。它以一个常量 cstring 作为参数并将其 append 在调用它的字符串的末尾。

函数原型(prototype)如下:

void append(char *str );

预期工作:

String s1("John");

s1.append(" Doe");

s1.display();

结果应该是:

John Doe

我得到了什么?

John

我在做什么?

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

    1. 正在将 data 的内容复制到 temp

    2. 重新声明大小等于 temp+CStringToBeAppended+1 的数据

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

    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] != '\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 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打扮得花哨的类(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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com