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

Posted

技术标签:

【中文标题】如何从函数创建和返回字符串?【英文标题】:How to create and return string from function? 【发布时间】:2018-05-24 10:27:52 【问题描述】:

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

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

#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]; 移到函数之外,从而使其成为全局,那么它可以工作。

那么答案是拥有一个可用于结果的全局字符缓冲区(字符串)吗?

可能会做类似的事情:

char * hello_world(char * res)

    memcpy(res, "Hello world\n", 13);  // 11 characters + newline + 0 for string termination
    return res;


char res[13];

int main(void)

    printf(hello_world(res));
    return 0;

【问题讨论】:

使用std::string? 或者您可以添加using namespace std。它是 C++ 标准库,它是类和函数的集合。内置的 C++ 库例程保存在标准命名空间中。这包括 cout、cin、string、vector、map 等内容。 【参考方案1】:

不要为那些 20 世纪初的东西而烦恼。到上个世纪末,我们已经有了std::string,这很简单:

#include <iostream>
#include <string>

std::string hello_world()

    return "Hello world\n";


int main()

    std::cout << hello_world();

【讨论】:

感谢您的建议;接受了另一个答案,因为它更接近实际应用程序。【参考方案2】:

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

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;

【讨论】:

【参考方案3】:

最好的解决方案是使用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;

【讨论】:

【参考方案4】:

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

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

【讨论】:

memset 有什么用?没关系。此外,如果 size 太小,sprintf 会导致缓冲区溢出。 你说的完全正确,它没有任何理由。让我编辑一下。

以上是关于如何从函数创建和返回字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Python ctypes:如何调用应该返回字符串数组的函数?

C -(malloc、calloc 或静态)从函数返回的 2d 字符数组

如何从 lambda 函数返回字符串?

C ++:从函数、返回类型或引用中使用和返回字符数组?

如何从函数中返回字符串

如何创建一个函数,以便它从 if 语句中返回一个字符?