向字符数组 c++ 添加字符

Add characters to a character array c++

本文关键字:字符 添加 c++ 数组      更新时间:2023-10-16

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

我正在尝试向字符数组添加字符。 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] = '';
}
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;
}

这一行是错误的:

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

你不应该采用sizeof(char*),你的c变量是,但你应该做sizeof(char)或只做1。

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

如何修复我的代码?

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

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

好的,

好的,这是如何...

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

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

首先,我假设这是您学习"如何创建自己的字符串类"的学习练习是否正确? C++已经有一个内置的字符串类型,您应该在大多数情况下始终喜欢它。

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

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

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

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