Как в одну функцию передать 2 массива(указатели) string и вернуть их тоже 2
Имеются массивы их нужно отдать функции на обработку, и вернуть их тоже 2. Один массив передаём и возвращаем через указатели всё работает, а как это сделать с двумя? в одну функцию. Спасибо.
Ответы (2 шт):
Если вы передали массив в функцию через указатель, то вам ничего возвращать не нужно, любые махинации, которые вы проводите над указателем (над массивом который располагается по адресу записанному в указатель), этот массив изменяют.
#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]
К примеру для параметров запуска приложения используют массив, argc и в argv лежат сами параметры.
void main(int argc, char **argv) {
int i;
for (i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
}
Таким же образом ваша функция может возвращать указатель на массив указателей. В функции можно создать динамический массив указателей и вернуть ссылку на него. После прочтения и действий,не забудьте очистить его free(). Ну или сразу в функцию передавать указатель на массив указателей, в функции его изменять и его возвращать.