@KindOfHeaven

Как вернуть массив строк C++?

Как мне вернуть из функции массив строк?
string *func(string s) {
    static string str[] = {"qwe", s ,"\0"};
    return str;
}
int main()
{
    string exp = "1234566";
    string arr[0] = func(exp); // Здесь ошибка - Array initializer must be an initializer list
    return 0;
}
  • Вопрос задан
  • 1262 просмотра
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как мне вернуть из функции массив


Учи матчасть: массив из функции вернуть нельзя. Можно вернуть указатель на массив или структуру содержащую массив.

string arr[0] = func(exp);


Слева в этом выражении стоит массив из нуля элементов. Справа -- указатель на string.
Что ты хотел этим выражением сказать?
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
ВНИМАНИЕ: У вас есть пара тонких мест.
РАЗ. не забудьте, что строковые литералы в Си — это нуль-терминированные строки, и "\0" по факту будет пустой строкой. Строку из одного нулевого символа можно загнать в string — например, конструктором string(begin, end) или s += '\0', но не конструктором string(const char*).
ДВА. Этот static будет инициализирован при первом вызове. Второй вызов вернёт тот же массив.
ТРИ. Строчку лучше передавать как string *func(const string& s) {}

К делу. Массив — это довольно сложный объект, и возникает вопрос: кто этим массивом будет владеть после того, как он покинет пределы функции?
1. Владеет система времени выполнения. Это отлично ответил Роман, дам только ключевую строчку.
string* arr = func(exp);
НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ: если массив используется в чьих-то «конских» конструкторах-деструкторах статических объектов (из-за отсутствия модулей Си++ не позволяет установить на уровне языка порядок создания/уничтожения статических объектов).

2. Владеет какой-то объект.
string *func(string s) {
    static string* ar = nullptr;
    if (ar) delete[] ar;
    ar = new ar[3];
    ar[0] = "qwe";
    ar[1] = s;
    ar[2].clear();
    return ar;
}

НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ: ну, это уж разбирайтесь сами с этим объектом, сколько он будет жить и насколько долго он будет держать массив. В данном случае каждый новый вызов уничтожает старый массив. (Код корявый, потому что последний массив не уничтожается.)

3. Владеет тот, кто вызывает. Лучше для таких целей использовать какой-нибудь std::vector.
vector<string> func(string s) {
    vector<string> r;
    r.reserve(3);
    r.push_back("qwe");
    r.push_back(s);
    r.push_back(std::string());
    return r;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы