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

标签 c++ string class append

我正在编写自己的 String 类,并且在使用追加函数时遇到问题。它接受一个常量 cstring 作为参数,并将其 append 到调用它的 String 的末尾。

该函数具有以下原型(prototype):

void append(char *str );

预期工作:

String s1("John");

s1.append(" Doe");

s1.display();

结果应该是:

John Doe

我得到了什么?

John

我在做什么?

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

    1. data的内容复制到temp中。

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

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

    4. 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/

相关文章:

c++ - 如何将多个纹理加载到片段着色器中

c# - 文本框在加号前显示换行符

python - 从列表列表中的字符串中查找并拆分字符

java - 使用 char 数组将字符串转换为 int

c# - 为什么我在实例化接口(interface)时出错?

c# - 在另一个对象中实例化一个对象? (C#)

flutter - 创建可重用小部件的函数和类之间有什么区别?

c++ - 确定如何定义类型

C++11 不能转换模板继承

java - 从android部分发送图像并从pc接收它,但是图像已损坏