使用指针将一个char数组添加到另一个char数组

时间:2013-08-03 15:14:42

标签: c++ pointers

我有一个这样的功能正常工作:

    char* add(char* origText, char* paste)
{
    char* pointerToOrigText = origText;
    while (*pointerToOrigText!='\0')
        pointerToOrigText++;
    while (*paste!='\0')
        *pointerToOrigText++=*paste++;
    *pointerToOrigText='\0';
 }

示例:origText =“abc”,paste =“def” 在函数之后:origText =“abcdef”,paste =“def”

所以我合并了两个字符串。但是当使用这个功能时:

char* add (char* origText,char *paste)
{
    int newLength = strlen(origText) + strlen(paste)+ 1; // + '\0'
    char* newText = new char[newLength]; // we want to make sure that 2 strings will fit.

    char* pointerToNewText = newText; // pointer to char array where we will merge strings
    char* helpPointer = origText; // helps us count until '\0'

    while (*helpPointer!='\0')
    {
        *pointerToNewText=*helpPointer;
        *pointerToNewText++; *helpPointer++;
    }

    while (*paste!='\0')
    {
        *pointerToNewText=*paste;
        *pointerToNewText++; *paste++;
    }

    *pointerToNewText='\0';

    origText = newText;

   // cout <<origText<<endl;
}

输出外部功能是: origText =“abc”,paste =“def” 函数后:origText =“abc”,paste =“def”

我的书解释说是因为这句话:

char* newText = new char[newLength]; 

但我不明白。为什么在函数中分配内存会影响指针origText。

4 个答案:

答案 0 :(得分:4)

在函数内部,origText是传入的变量的单独变量。所以你在那里做的任何事情(例如origText = newText都不会影响调用者的变量。

相反,该函数看起来应该返回指向新字符串的指针:

char* // That's the function's return type: it must return that
add(const char* origText, // Added const: the function doesn't change this string
    const char* paste)    // And again
{
    // Your code (with a bit more const), followed by
    return newText;
}

现在,当您调用该函数时,您可以使用其返回值:

const char* origText = "abc";
const char* paste = "def";

char* newText = add(origText, paste);

std::cout << origText << std::endl;    // abc - unchanged
std::cout << paste    << std::endl;    // def - unchanged
std::cout << newText  << std::endl;    // abcdef - result of concatenation

delete [] newText; // Don't forget to delete whatever you create with new.

一旦你理解了所有这些讨厌的内存管理是如何工作的,你应该学会使用std::string类来为你做这一切:

std::string origText = "abc";
std::string paste = "def";
std::string newText = origText + paste; // Does exactly what you think it does.

答案 1 :(得分:1)

* pointerToNewText ++; * helpPointer ++;

* pointerToNewText ++; *粘贴++; // <强>错误。只是指针指向的值增加了。

origText = newText; // 无用。

您应该使用以下代码:

char* add (char* origText,char *paste)
{
    int newLength = strlen(origText) + strlen(paste)+ 1; // + '\0'
    char* newText = new char[newLength]; // we want to make sure that 2 strings will fit.

    char* pointerToNewText = newText; // pointer to char array where we will merge strings
    char* helpPointer = origText; // helps us count until '\0'

    while (*helpPointer!='\0')
    {
        *pointerToNewText=*helpPointer;
        pointerToNewText++; helpPointer++;
    }

    while (*paste!='\0')
    {
        *pointerToNewText=*paste;
        pointerToNewText++; paste++;
    }

    *pointerToNewText='\0';

    return newText ;
}

答案 2 :(得分:1)

在您的代码中,字符串的地址通过值传递给origText,因此它是一个局部变量。行origText = newText;不会改变外部的实际指针。您必须更改为通过指向原始指针的指针,或使用按引用传递

char* add (char** origText,char *paste)

*origText = newText;

char* add (char*& origText,char *paste)

origText = newText;

而且,您的代码不会返回任何内容

答案 3 :(得分:0)

  

为什么在函数中分配内存会影响指针origText。

你的函数版本只是将额外的文本添加到原始字符串上,覆盖原始字符串后存储在内存中的内容。如果没有什么重要的话,这可能会很好,或者它可能导致崩溃或产生安全问题。正确的解决方案是分配一个足够大的新内存来保存新的组合字符串并在那里复制两个字符串。