Как в одну функцию передать 2 массива(указатели) string и вернуть их тоже 2

Имеются массивы их нужно отдать функции на обработку, и вернуть их тоже 2. Один массив передаём и возвращаем через указатели всё работает, а как это сделать с двумя? в одну функцию. Спасибо.


Ответы (2 шт):

Автор решения: NunOfIt

Если вы передали массив в функцию через указатель, то вам ничего возвращать не нужно, любые махинации, которые вы проводите над указателем (над массивом который располагается по адресу записанному в указатель), этот массив изменяют.

#include <string>
#include <iostream>

void func(std::string* arr1, size_t n1, std::string* arr2, size_t n2) {
    // Пример:
    for(size_t i = 0; i < n1; ++i)
        arr1[i] = "first_arr_func1";
    for(size_t i = 0; i < n2; ++i)
        arr2[i] = "second_arr_func1";
}

template<size_t N1, size_t N2>
void func(std::string (&arr1)[N1], std::string (&arr2)[N2]) {
    // Пример:
    for(size_t i = 0; i < N1; ++i)
        arr1[i] = "first_arr_func2";
    for(size_t i = 0; i < N2; ++i)
        arr2[i] = "second_arr_func2";
}

template<size_t N>
char print(std::string (&arr)[N]) {
    std::cout << '[';
    if(N) {
        std::cout << arr[0];
        for(size_t i = 1; i < N; ++i)
            std::cout << ' ' << arr[i];
    }
    std::cout << ']';
    return '\0';
}

int main() {
    std::string arr1[2] = {"abc", "def"};
    std::string arr2[4] = {"ab", "cd", "ef", "g"};

    std::cout << "arr1: " << print(arr1) << '\n';
    std::cout << "arr2: " << print(arr2) << "\n\n";

    func(&arr1[0], 2, &arr2[0], 4);
    std::cout << "func1:\n";
    std::cout << "---> arr1: " << print(arr1) << '\n';
    std::cout << "---> arr2: " << print(arr2) << "\n\n";

    func(arr1, arr2);
    std::cout << "func2:\n";
    std::cout << "---> arr1: " << print(arr1) << '\n';
    std::cout << "---> arr2: " << print(arr2) << "\n\n";
    return 0;
}

Вывод:

arr1: [abc def]
arr2: [ab cd ef g]

func1:
---> arr1: [first_arr_func1 first_arr_func1]
---> arr2: [second_arr_func1 second_arr_func1 second_arr_func1 second_arr_func1]

func2:
---> arr1: [first_arr_func2 first_arr_func2]
---> arr2: [second_arr_func2 second_arr_func2 second_arr_func2 second_arr_func2]
→ Ссылка
Автор решения: FrancNet

К примеру для параметров запуска приложения используют массив, argc и в argv лежат сами параметры.

void main(int argc, char **argv) {
    int i;
    for (i = 0; i < argc; i++) {
        printf("%s\n", argv[i]);
    }
}

Таким же образом ваша функция может возвращать указатель на массив указателей. В функции можно создать динамический массив указателей и вернуть ссылку на него. После прочтения и действий,не забудьте очистить его free(). Ну или сразу в функцию передавать указатель на массив указателей, в функции его изменять и его возвращать.

→ Ссылка