-1

有人可以告诉我以下有什么问题吗?

我正在尝试将字符添加到字符数组中。name 是指向 MyString 类中的字符数组的指针。

void MyString::add_chars(char* c)
{
        if(l < strlen(c)+strlen(name))
                name = resize(name, l, sizeof(c));
        int i,j;
        for(i=0; i<strlen(c); i++) {
                name[i+l-1] = c[i];
                l++;
        }
}

char* MyString::resize(char* vptr, int currentsize, int extra) {
        char* temp = new char[currentsize + extra];
        int i;
        for (i = 0; i < currentsize; i++) {
                temp[i] = vptr[i];
        }
        vptr = temp;
        return vptr;
}

主要是:

 MyString g ("and");
 g.add_chars("baasdf");
 cout << g.get_name() << "\n";

但是 get_name 返回“andb”。如何修复我的代码?

编辑: 更新的代码,仍然是相同的结果..

void StringList::add_chars(char* c)
{
        char* my_new_string = resize(name, l, sizeof(char));
        if( my_new_string != NULL )
        {
                delete [] name;
                name = my_new_string;
        }
        int i,j;
        for(i=0; i<strlen(c); i++) {
                name[i+l-1] = c[i];
                l++;
        }
        name[l-1] = '\0';
}

char* StringList::resize(char* vptr, int currentsize, int extra) {
        char* temp = new char[currentsize + extra + 1];
        int i;
        for (i = 0; i < currentsize; i++) {
                temp[i] = vptr[i];
        }
        vptr = temp;
        return vptr;
}
4

3 回答 3

1

这一行是错误的:

 name = resize(name, l, sizeof(c));

您不应该使用sizeof(char*)您的c变量所在的 ,但您应该使用sizeof(char)1 或仅使用 1。

此外,请确保您对大小执行 +1 以处理char字符串末尾的零终止。

于 2012-04-20T18:30:33.220 回答
0

首先,我是否正确地假设这是您学习“如何创建自己的字符串类”的学习练习?C++ 已经有一个内置的字符串类型,你应该总是喜欢它。

运算符sizeof产生其操作数的大小(以字节为单位),在本例中为c,其类型为char*- 看起来您实际上所追求的是空终止字符数组(“C”字符串)的长度- 你已经在使用strlen,所以我建议你只是想再次使用它。(也考虑到空终止符)

name = resize(name, l, strlen(c) + 1);

请注意,您的代码看起来好像存在内存泄漏。您正在为name变量分配一个新值,而没有先清除那里存在的任何内容。

if(l < strlen(c)+strlen(name))
{
    char* my_new_string = resize(name, l, strlen(c));
    if( my_new_string != NULL )
    {
        delete [] name;
        name = my_new_string;
    }
}

编辑:正如其他回复所指出的那样,可以使用 C++stringvector.

这是实现 add_chars 的一种可能方式

void MyString::add_chars(char* c)
{
    if( c != NULL && name != NULL )
    {
        size_t newlength = strlen(c) + strlen(name) + 1;
        char* newstring = new char[newlength];

        if( newstring != NULL )
        {
            size_t namelength = strlen(name);
            size_t remaining = newlength - namelength;

            strncpy( newstring, name, newlength );
            strncpy( &newstring[namelength] , c, remaining );

            delete [] name;
            name = newstring;
        }
    }
}
于 2012-04-20T18:29:40.613 回答
0

如何修复我的代码?

不要修复它。扔掉它并使用vector<char>或只是string

但我坚持,我怎样才能修复我的代码!?

好的,好的,方法如下...

  1. 获取一个不错的调试器,例如这个.
  2. 仔细检查代码,不断检查变量并将它们与您期望的值进行比较。
  3. 当您到达对 的调用时resize,请记下sizeof(c)(分配给 的extra参数resize)。当你意识到这不是你所期望的,问问自己: 的目的是什么sizeof,你就会明白为什么。

顺便说一句,由于所有这些,您还存在内存泄漏和性能非常差strlen的问题。

于 2012-04-20T18:41:37.980 回答