Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 6_Основы функции.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
257.54 Кб
Скачать

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

6.10.1.Строковые константы

С++ работает со строковыми константами, вроде той, что используется в приведенном ниже предложении:

cout << strlen("Ксантиф");

Когда компилятор сталкивается со строковой константой, он сохраняет ее в таблице строк данной программы и создает указатель на эту строку. В результате "Ксантиф" образует указатель на начало этой фразы в таблице строк программы. Ниже приведена программа, которая выводит фразу "Указатели увеличивают возможности С++":

#include <iostream>

using namespace std;

int main ()

{

char *ptr;

// Указателю ptr присваивается адpec этой строковой константы

ptr = " Указатели увеличивают возможности C++.\n";

cout << ptr;

return 0;

}

В этой программе символы, образующие строковую константу, хранятся в таблице строк, и указателю ptr присваивается адрес нашей строки в этой таблице.

6.10.2. Передача строк

Строка представляет собой обычный массив символов с нулем в конце, и когда вы передаете строку в функцию, фактически передается только указатель на начало строки. Этот указатель имеет тип char *. Рассмотрим в качестве примера следующую программу. В ней определена функция strInvertCase( ), которая преобразует строчные буквы строки в прописные и наоборот:

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

#include <iostream>

#include <cstring> I

#include <cctype>

using namespace std;

void strlnvertCase(char *str);

int main(){

char str[80];

strcpy(str, "This Is A test");

strlnvertCase(str);

cout << str; // вывод модифицированной строки

return 0;

}

// Преобразование регистра букв внутри строки,

void strlnvertCase(char *str)

{

while(*str) {

// преобразуем регистр

if(isupper(*str) ) *str = tolower(*str) ;

else if(islower(*str) ) *str = toupper(*str) ;

str++; // сместимся к следующему символу

}

}

Вот вывод этой программы:

tHIS iS a tEST

6.11. Возврат указателей

Функции могут возвращать указатели. Указатели возвращаются, как и данные любых других типов, и не вызывают никаких особых проблем.

В приводимой ниже программе демонстрируется использование указателя в качестве возвращаемого значения. Функция get_substr( ) просматривает строку в поисках заданной подстроки. Функция возвращает указатель на первую найденную подстроку. Если заданной подстроки найти не удалось, возвращается нулевой указатель. Например, если анализируется строка "Я люблю С++", а в качестве искомой задана подстрока "люблю", то функция вернет указатель на первую букву л в слове "люблю".

//Возврат указателя.

#include <iostream>

using namespace std;

char *get_substr(char *sub, char *str);

int main ()

{

char *substr;

substr = get_substr("three", "один два three four");

cout << "подстрока найдена: " << substr;

return 0;

}

/* Возвращает указатель на подстроку или нулевой указатель,

если подстрока не найдена.*/

char *get_substr(char *sub, char *str)

{

char *p, *p2, *start;

for(int t = 0; str[t] ; t ++)

{

p = &str[t]; // начальная установка указателей

start = p;

p2 = sub;

//проверка на наличие подстроки

while(*p2 && *p2==*p)

{

p ++;

p2 ++;

}// end while

/* Если р2 указывает на завершающий 0 (т. е. на

конец подстроки), значит, вся подстрока найдена. */

if(!*p2)

return start;// вернуть указатель на начало подстроки

}//end for

return 0; // подстрока не найдена

}

Вот вывод этой программы:

подстрока найдена: три четыре

Вопросы для самопроверки

  1. Приведите общую форму определения функции.

  2. Создайте функцию hypot(), которая вычисляет гипотенузу прямоугольного треугольника по двум его катетам. Продемонстрируйте использование этой функции в программе.

  3. Может ли функция вернуть указатель? Может ли функция вернуть массив?

  4. Создайте собственный вариант функции strlen() стандартной библиотеки.