Передача строки в функцию

Просматривая статьи о функциях на разных сайтах для новичков в С++, прихожу к выводу, что, зачастую, в примерах показано, как передавать функциям, в качестве параметров,  числовые типы данных (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

Можно ввести строку в круглых скобках при вызове функции:
~~~ ~~~ ~~~ 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 прекратит работу.

Результат — наша «новогодняя гирлянда» :)

CppStudio.com

Исходная строка: 12341234123412341234123

Измененная строка: ~~~О~~~О~~~О~~~О~~~О~~~

Каким способом передать строку в функцию — определяйтесь сами. Если у вас остались вопросы по теме, задавайте их нам в комментариях к этой статье. Мы вам обязательно ответим и поможем разобраться.

Автор: Marienko L.
Дата: 15.12.2013
Поделиться:

Комментарии

  1. Владимир

    Как передать массив в функцию понятно. Но как получить массив из функции? У меня результат работы функции — массив символов char[150]. И единственный способ его от туда достать, который нашел я методом тыка — это в цикле по 1  символу получать, что очень и очень не удобно и не подходит для моих целей.

    • Marienko L.

      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.

        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;        
        }
        
        попробуйте так. И Давайте переместимся с той темой в наш форум. Создайте там тему и напишите весь исходный код и вопросы.

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.