将字符添加到字符数组c ++中

时间:2012-04-20 18:23:18

标签: c++ pointers

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

我正在尝试将字符添加到字符数组中。 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;
}

3 个答案:

答案 0 :(得分:1)

这一行错了:

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

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

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

答案 1 :(得分:0)

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

sizeof运算符产生其操作数的大小(以字节为单位),在本例中为 c ,其类型为char* - 它看起来像你的实际上after是以null结尾的字符数组的长度(“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;
    }
}

EDIT :正如其他回复所指出的那样,代码仍有很多错误,可以使用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;
        }
    }
}

答案 2 :(得分:0)

  

如何修复我的代码?

不要修理它。扔掉它并使用vector<char>string

  

但我坚持说,我该如何修复我的代码呢?

好的,好的,这就是......

  1. 获取一个不错的调试器,例如this one
  2. 仔细检查代码,不断检查变量并将它们与您期望的变量进行比较。
  3. 当您拨打resize时,请注意sizeof(c)(已分配到extra的{​​{1}}参数。当你意识到这不是你的期望时,问问自己:resize目的是什么,你就会理解为什么。
  4. 顺便说一句,由于所有这些sizeof s,你的内存泄漏和性能都很差。