2

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

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”,粘贴 = “def”
  • 函数后:origText = "abc", paste = "def"

我的书解释说,这是因为这条线:

char* newText = new char[newLength]; 

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

4

4 回答 4

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.
于 2013-08-03T15:25:12.217 回答
1

*pointerToNewText++; *帮助指针++;

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

原始文本 = 新文本;//没用。

您应该使用以下代码:

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 ;
}
于 2013-08-03T15:22:45.487 回答
1

origText在您的代码中,字符串的地址通过将其复制到局部变量按值传递给函数。该行origText = newText;不会改变外部的真实指针。您必须将指针传递给原始指针

char* add (char** origText,char *paste)
*origText = newText;

或使用引用传递

char* add (char*& origText,char *paste)
origText = newText;

此外,您的代码不会返回任何内容。您必须退回一些char*或更改签名以退回void

于 2013-08-03T15:25:06.693 回答
0

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

您的函数版本只是将额外的文本添加到原始字符串上,覆盖原始字符串之后存储在内存中的任何内容。如果那里没有任何重要的东西,那可能会正常工作,否则可能会导致崩溃或产生安全问题。正确的解决方案是分配一块足够大的新内存来保存新的组合字符串并将两个字符串复制到那里。

于 2013-08-03T15:31:33.310 回答