Просматривая статьи о функциях на разных сайтах для новичков в С++, прихожу к выводу, что, зачастую, в примерах показано, как передавать функциям, в качестве параметров, числовые типы данных (int
, float
, double
и т.д.). Так появилась идея написать данную статью, где на практике хочу показать, как передать строку (она же — массив символов) в функцию в виде параметра. И просто замечательно, что в С++ таких способов несколько. Вы можете выбрать тот, который вам просто понравится или который больше подойдет для решения поставленной перед вами задачи.
Способы передачи строки в функцию хочу показать на одном примере. Чтобы лучше освоить материал и взять максимум пользы от прочитанного, открывайте свою среду разработки и переписывайте код по мере прочтения. Практика – лучший способ что-то понять и запомнить. Под примером будут расположены подробные комментарии и разъяснения по данному коду.
Приступим:
#include <iostream> using namespace std; //определяем функции void showText1 (char str[])//функция принимает строку, как массив { cout << str << endl; } void showText2 (char *str)//указатель *str будет указывать на адрес первого символа в строке { cout << str << endl; } void showText3 (char (&str)[150])// адрес строки из 150-ти символов { cout << str << endl; } int main() { setlocale (LC_ALL, "rus"); cout << "Можно ввести строку в круглых скобках при вызове функции: " << endl; showText1("~~~ ~~~ ~~~ cppstudio.com ~~~ ~~~ ~~~"); cout << endl; char str1[] = "str1 - передаем, как массив в функцию void showText1 (char str[]);"; showText1(str1); cout << endl; char str2[] = "str2 - передаем, в функцию void showText2 (char *str); используя указатель."; showText2(str2); cout << endl; char str3[150] = "str3 - передаем, в функцию void showText3 (char &str[]);\nТут используем адрес строки."; showText3(str3); cout << endl; return 0; }
Задача всех наших созданных функций – отобразить на экране строки, которые переданы им, как параметры. Пойдем по порядку:
1) первый способ — функция void showText1 (char str[]) принимает строку, как массив — строка 4. При определении функции, в круглых скобках надо вписать тип массива (строки) char
, имя строки и квадратные скобки []
. Обратите внимание, что нам не надо указывать размерность массива (количество символов в строке). С помощью символа ‘\0′, который автоматически добавляется в конец любой строки, функция сама найдет последний элемент массива и прекратит вывод элементов на экран.
2) второй способ, передача строки в функцию при помощи указателя, самый распространенный вариант — строка 9. При определении функции, перед именем строки ставим оператор *
— void showText2 (char *str)
.
3) ну и третий способ, передача в функцию строки по адресу — строка 14. В нашем примере это функция void showText3 (char (&str)[150])
. Тут следует быть внимательным, т.к. необходимо указывать точный размер строки. Без этого компилятор выдаст ошибку (Мы проверяли :)). А так же важно взять в круглые скобки оператор &
с именем строки — (&str)
. В строке 38 нашего кода, вы можете видеть, что строка char str3[150]
содержит явно меньше символов. Остальным, не инициализированным, будет присвоено значение '\0'
.
Думаю, строки 23-25 говорят сами за себя и комментировать не стоит. Иногда, так удобно сделать, не объявляя и не определяя строку заранее.
При вызове функций все просто – надо лишь внести название необходимой строки в круглые скобки. Строки 29, 34, 39.
Результат:
Можно ввести строку в круглых скобках при вызове функции:
~~~ ~~~ ~~~ cppstudio.com ~~~ ~~~ ~~~
str1 — передаем, как массив в функцию void showText1 (char str[]);
str2 — передаем, в функцию void showText2 (char *str); используя указатель.
str3 — передаем, в функцию void showText3 (char &str[]);
Тут используем адрес строки (адрес первого элемента символьного массива)
А вот еще один пример, который покажет насколько удобно работать с указателем в функциях. В нем функция примет, в качестве параметра, указатель на строку символов, с помощью указателя пройдет по каждой ячейке памяти строки и изменит числовые символы на знак ~
или на букву O
. В результате строка, содержащая числовые символы 1234123412341234
и т.д., с легкостью превратится в “новогоднюю гирлянду”. В этом коде указатель покажет себя, как альтернатива управляющей переменной в цикле while
:
#include <iostream> using namespace std; void changeSymbol(char *str) { while(*str != '\0')//пока значение ячейки не равно символу конца строки { if (*str == '4') *str = 'O'; else *str = '~'; str++;//на каждой итерации цикла, указатель смещается на одну ячейку } } int main() { setlocale(LC_ALL, "rus"); char str[] = {"12341234123412341234123"}; cout << "Исходная строка: " << str << endl << endl; changeSymbol(str);//передаем исходную строку в функцию cout << "Измененная строка: " << str << endl << endl; return 0; }
Смотрите, как интересно получается: как мы знаем, указатель указывает на адрес первой ячейки памяти строки, т.е. в нашем случае на str[0]
. Значит, используя операцию разыменовывания указателя *
, мы можем посмотреть, какой символ в этой ячейке хранится и, если надо, заменить его на другой — строки 6, 8, 9. Плюс, мы можем использовать указатель на строку, вместо управляющей переменной в нашем цикле while
. Для этого, на каждой итерации цикла, инкрементируем указатель str++
— строка 11. Таким образом, указатель будет указывать уже на очередную ячейку памяти нашей строки. Так будет происходить до тех пор, пока указатель не перейдет на ячейку с символом '\0'
. Тут цикл while
прекратит работу.
Результат — наша «новогодняя гирлянда» :)
Исходная строка: 12341234123412341234123
Измененная строка: ~~~О~~~О~~~О~~~О~~~О~~~
Каким способом передать строку в функцию — определяйтесь сами. Если у вас остались вопросы по теме, задавайте их нам в комментариях к этой статье. Мы вам обязательно ответим и поможем разобраться.
Комментарии
Владимир
Как передать массив в функцию понятно. Но как получить массив из функции? У меня результат работы функции — массив символов char[150]. И единственный способ его от туда достать, который нашел я методом тыка — это в цикле по 1 символу получать, что очень и очень не удобно и не подходит для моих целей.
Marienko L.
функция тогда должна быть типа char и возвращать строку через оператор return. Надо посмотреть Ваш код, чтобы подсказать что-то конкретное
Владимир
Тип char я ставлю, но если приписываю размер массива, говорит что нельзя:( Если просто char, а в конце return a, сообщает, что тип данных не соответствует, ибо a — char [150]; Вот в итоге и вывожу обычной переменной по 1 букве в цикле.
Код сейчас не могу скинуть, под рукой нету компьютера.
Владимир
Marienko L.