Просматривая статьи о функциях на разных сайтах для новичков в С++, прихожу к выводу, что, зачастую, в примерах показано, как передавать функциям, в качестве параметров, числовые типы данных (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 букве в цикле.
Код сейчас не могу скинуть, под рукой нету компьютера.
Владимир
char cht(void) { char buf; char MX[70]; int b; ifstream f2("MX.txt", ios::in); if (!f2.is_open()) {cout <<"1"; system("pause"); return 0;} while (!f2.eof()) f2 >> MX; f2.close(); ifstream f("ps2.txt", ios::in); f >> b; buf = MX[rs(b)]; system("pause"); return buf; } Как видно, функция скачивает из файла числовые значения, обрабатывает их другой функцией, и возвращает текстовые значения. Но из за того, что не понял, как выводить значения сразу массивом пришлось переделать под одиночное значение. Но поскольку каждый раз файл открывается заново, то и выводит он только 1е значение из файла:( Вот и не знаю как бы обойти это.Marienko L.
char *cht(void) { char *buf = new char[70]; //так понимаю, что сюда надо скопировать массив MX в итоге char MX[70] = ""; int b; ifstream f2("MX.txt", ios::in); if (!f2.is_open()) {cout <<"1"; system("pause"); return 0;} while (!f2.eof()) f2 >> MX; f2.close(); //ifstream f("ps2.txt", ios::in); //f >> b; //buf = MX[rs(b)]; strcpy(buf, MX); // копируем весь массив МХ в buf system("pause"); return buf; } попробуйте так. И Давайте переместимся с той темой в наш форум. Создайте там тему и напишите весь исходный код и вопросы.