Как создать и вернуть строку из функции? - PullRequest
0 голосов
/ 24 мая 2018

Хотелось бы сгенерировать строку из функции, чтобы отформатировать некоторые данные, поэтому функция должна вернуть строку.

Попытка сделать «очевидное», показанное ниже, но это печатает мусор:

#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 используетstack.

Если я переместу 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;
}

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

Тем не менее, если вы хотите написать чистый код на 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;
}
0 голосов
/ 24 мая 2018

Вы программируете .Это неплохо, но ваш вопрос о , так что это решение для вашего вопроса:

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;
}
0 голосов
/ 24 мая 2018

Лучшим решением будет использовать 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;
}
0 голосов
/ 24 мая 2018

Не беспокойтесь об этом материале начала 20-го века.К концу прошлого века у нас уже было std::string, и это просто:

#include <iostream>
#include <string>

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

int main()
{
    std::cout << hello_world();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...