C ++:如何使用new来查找函数返回值的商店?

时间:2013-07-27 23:38:36

标签: c++

我正在阅读Bjarne Stroustrup的第3版 The C ++ Programming Language 并试图完成所有练习。我不确定如何从第6.6节开始练习13,所以我想我会转向Stack Overflow以获得一些洞察力。以下是问题的描述:

  

编写一个函数 cat(),它带有两个C风格的字符串参数和   返回一个字符串,它是参数的串联。   使用 new 查找结果商店。

到目前为止,这是我的代码,带有问号,我不知道该怎么做:

? cat(char first[], char second[])
{
    char current = '';
    int i = 0;

    while (current != '\0')
    {
        current = first[i];
        // somehow append current to whatever will eventually be returned
        i++;
    }

    current = '';
    i = 0;

    while (current != '\0')
    {
        current = second[i];
        // somehow append current to whatever will eventually be returned
        i++;
    }

    return ?
}

int main(int argc, char* argv[])
{
    char first[]  = "Hello, ";
    char second[] = "World!";

    ? = cat(first, second);

    return 0;
}

以下是我的问题:

  1. 如何使用 new 查找商店?我希望做std::string* result = new std::string;之类的事情,还是应该使用 new 以某种方式创建另一个C风格的字符串?
  2. 与上一个问题相关,我应该从cat()返回什么?如果我必须使用 new ,我认为它需要是一个指针。但指向什么?
  3. 虽然问题没有提到使用 delete 来释放内存,但我知道我应该因为我将使用 new 来分配。我应该在返回主页之前删除吗?

7 个答案:

答案 0 :(得分:4)

在“真实”程序中,是的,你会使用std :: string。听起来这个例子让你想要使用C字符串。

所以也许是这样的:

char * cat(char first[], char second[])
{
    char *result = new char[strlen(first) + strlen(second) + 1];

...

问:你如何“追加”?

答:只需将“第一”中的所有内容写入“结果”。

一旦你完成,然后继续将所有内容写入“秒”结果(从你离开的地方开始)。完成后,请务必在末尾追加'\ 0'。

答案 1 :(得分:4)

  

如何使用 new 查找商店?我是否应该做std::string* result = new std::string;之类的事情,或者我应该使用 new 以某种方式创建另一个C风格的字符串?

后者;该方法采用C风格的字符串,文本中没有任何内容表明它应该返回任何其他内容。因此,函数的原型应为char* cat(char const*, char const*)。当然这是你通常如何编写函数;手动内存管理在现代C ++中完全是禁忌,因为它容易出错。

  

虽然问题没有提到使用delete来释放内存,但我知道我应该因为我将使用new来分配。我应该在主要结束时删除,在返回之前删除吗?

在本练习中,是的。在现实世界中,没有:就像我上面所说,这完全是禁忌。实际上,您将使用std::string返回new而不是分配内存。 如果你发现自己手动分配内存(假设这是有充分理由的话),你就不会将内存放在原始指针中,而是放在智能指针上 - std::unique_ptrstd::shared_ptr

答案 2 :(得分:3)

  1. 你应该返回一个C风格的字符串,所以你不能使用std::string(或者至少,这不是“在问题的精神中”)。是的,您应该使用new来制作C风格的字符串。
  2. 你应该返回你生成的C风格的字符串...所以,指向你新创建的字符串的第一个字符的指针。
  3. 正确,您应该删除最后的结果。我希望它可能会被忽略,因为在这种特殊情况下,它可能并不重要 - 但为了完整性/正确性,你应该这样做。

答案 3 :(得分:3)

这是我从我的一个项目中挖出来的一些旧代码:

char* mergeChar(char* text1, char* text2){
    //Find the length of the first text
    int alen = 0;
    while(text1[alen] != '\0')
        alen++;

    //Find the length of the second text
    int blen = 0;
    while(text2[blen] != '\0')
        blen++;

    //Copy the first text
    char* newchar = new char[alen + blen + 1];
    for(int a = 0; a < alen; a++){
            newchar[a] = text1[a];
    }

    //Copy the second text
    for(int b = 0; b < blen; b++)
        newchar[alen + b] = text2[b];

    //Null terminate!
    newchar[alen + blen] = '\0';
    return newchar;
}

通常,在“真实”程序中,您应该使用std::string。请稍后再确认delete[] newchar

答案 4 :(得分:2)

练习的意思是使用new来分配内存。 “查找商店”很奇怪,但事实上它就是它的作用。你告诉它你需要多少存储空间,它会找到你可以使用的可用内存块,并返回它的地址。

看起来练习不希望你使用std :: string。听起来你需要返回char*。所以函数原型应该是:

char * cat(const char first [],const char second []);

请注意const说明符。重要的是,您将能够将字符串文字作为参数传递。

因此,如果不立即提供代码,您需要做的是确定生成的char*字符串应该有多大,使用new分配所需的数量,将两个源字符串复制到新分配的空间,并将其返回。

请注意,您通常不会在C ++中手动执行此类内存管理(而是使用std::string),但了解它仍然很重要,这就是为什么这个练习的原因。

答案 5 :(得分:0)

您似乎需要使用new为字符串分配内存,然后返回指针。因此,return类型的cat将为`char*

你可以这样做:

int n = 0;
int k = 0;

//also can use strlen
while( first[n] != '\0' )
     n ++ ;
while( second[k] != '\0' )
     k ++ ;

//now, the allocation

char* joint = new char[n+k+1]; //+1 for a '\0'

//and for example memcpy for joining

memcpy(joint, first, n );
memcpy(joint+n, second, k+1); //also copying the null


return joint;

答案 6 :(得分:0)

它告诉你用C方式做这件事:

#include <cstring>

char *cat (const char *s1, const char *s2)
{
    // Learn to explore your library a bit, and
    // you'll see that there is no need for a loop
    // to determine the lengths. Anything C string
    // related is in <cstring>.
    //
    size_t len_s1 = std::strlen(s1);
    size_t len_s2 = std::strlen(s2);
    char *dst;

    // You have the lengths.
    // Now use `new` to allocate storage for dst.


    /*
     * There's a faster way to copy C strings
     * than looping, especially when you
     * know the lengths...
     *
     * Use a reference to determine what functions
     * in <cstring> COPY values.
     * Add code before the return statement to
     * do this, and you will have your answer.
     *
     * Note: remember that C strings are zero
     * terminated!
     */

    return dst;
}

当您释放分配的内存时,不要忘记使用正确的运算符。否则你会有内存泄漏。

快乐的编码! : - )