如何从函数创建和返回字符串?

时间:2018-05-24 10:27:52

标签: c++ string function

想从函数生成一个字符串,以便格式化一些数据,所以函数应该返回一个字符串。

试图做“明显的”,如下所示,但这会打印垃圾:

Select count(distinct Name) from Table where name not in (
select Name from Table  where Animal = 'Dog')

我认为这是因为用于函数中定义的#include <iostream> #include <string> char * hello_world() { char res[13]; memcpy(res, "Hello world\n", 13); return res; } int main(void) { printf(hello_world()); return 0; } 变量的堆栈上的内存在写入值之前被覆盖,可能是在res调用使用堆栈时。

如果我将printf移到函数外部,从而使其成为全局函数,那么它就可以工作。

具有可用于结果的全局字符缓冲区(字符串)的答案是什么?

也许做类似的事情:

char res[13];

4 个答案:

答案 0 :(得分:9)

不要为20世纪早期的事情烦恼。到上个世纪末,我们已经std::string了,这很简单:

#include <iostream>
#include <string>

std::string hello_world()
{
    return "Hello world\n";
}

int main()
{
    std::cout << hello_world();
}

答案 1 :(得分:5)

您正在编程。这不错,但你的问题是关于,所以这就是你问的问题的解决方案:

std::string hello_world()
{
    std::string temp;

    // todo: do whatever string operations you want here
    temp = "Hello World";

    return temp;
}

int main()
{
    std::string result = hello_world();

    std::cout << result << std::endl;

    return 0;
}

答案 2 :(得分:2)

最佳解决方案是使用std::string。但是,如果必须使用数组,则最好在调用函数中分配它(在本例中为main()):

#include <iostream>
#include <cstring>

void hello_world(char * s)
{
    memcpy(s, "Hello world\n", 13);
}

int main(void)
{
    char mys[13];
    hello_world(mys);
    std::cout<<mys;
    return 0;
}

答案 3 :(得分:1)

但是,如果你想编写纯C代码,可以做类似的事情。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *HelloWorld(char *s, int size)
{
        sprintf(s, "Hello world!\n");
        return s;
}

int main (int argc, char *argv[])
{
        char s[100];

        printf(HelloWorld(s, 100));

        return 0;
}