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

时间:2014-02-21 09:51:00

标签: c++ string class append

我正在编写自己的String类,并且在append函数中遇到问题。它将一个包含cstring的参数作为参数,并将其附加在String调用它的末尾。

该函数具有以下原型:

void append(char *str );

预期工作:

String s1("John");

s1.append(" Doe");

s1.display();

结果应为:

John Doe

我得到了什么?

John

我在做什么?

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

    1. 数据的内容复制到 temp

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

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

    4. 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;
}

2 个答案:

答案 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)

我做了一些改动

    复制数据后
  1. Null终止temp
  2. 使用变量j作为data的起点。用strlen(temp)分配j
  3. data的{​​{1}}替换为j++的<{1}}
    i