Строки. Функции для работы со строками 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Строки. Функции для работы со строками



Краткое описание самых распространенных функций для работы со строками. Прототипы данных функций располагаются в головном файле <string.h>.

1. size_t strlen(const char*s)- возвращает длину строки s в байтах не включая ‘\0’.

2. char*strcat(char*dest, const char*src)-присоединяет строку src в конец строки dest.

3. char*strcpy(char*dest, const char*src)-копирует строку src в место памяти на которое указывает dest.

4. char*strncat(char*dest, const char*src, size_t maxlen)- присоединяет maxlen символов строки src в место памяти на которое указывает dest.

5. char*strncpy(char*dest, const char*src)-копирует maxlen символов строки src в место памяти на которое указывает dest.

6. char*strstr(char*s1, const char*s2)- отыскивает первое вхождение строки s2 в строку s1.

7. char*strcmp(const char*s1, const char*s2)-сравнивает две строки в лексиграфическом порядке с учетом различия прописных и строчных букв.

8. char*stricmp(const char*s1, const char*s2)-сравнивает две строки в лексиграфическом порядке не различая прописные и строчные буквы.

27. Понятие функции.

Функция – это самостоятельная единица программы, спроектированная для реализации конкретной задачи, а имя функции должно отражать смысл данной задачи. В программе функции можно располагать в любой последовательности, программу разрешается подразделять на произвольное число файлов, которые либо процессором, либо компоновщиком объединяются в общий модуль. Все функции в программе на С равноправны (за исключением главной функции main()): каждая из них может вызвать любую другую и каждая, в свою очередь, может быть вызвана любой другой. Однако одна функция (ее определение) не может быть включена в другую функцию.

Прототип функции является предварительным объявлением данных функции. Прототип необходим компилятору для того, чтобы проконтролировать корректность вызова функции и в необходимых случаях, выполнить приведение аргументов к типу принимаемых параметров, т.е. принудительное преобразование аргументов функции к соответствующему типу, а как же сгенерировать корректный возвращаемый результат. В прототипе отсутствует тело функции, заключенное в {}.

Определение функции – это ее полная реализация. Определение имеет следующий синтаксис:

[спецификатор_класса_памяти][спецификатор_типа] имя_функции

([тип_параметра1 параметр1, тип_параметра2 параметр2, и т.д.])

{тело функции: объявление, определение данных, операторы}

Функции. Передача аргументов. Аргументы по умолчанию

Существует два способа передачи параметров функции:

· По значению (передавая копии данных);

· По ссылке (передавая адреса, по которым записаны значения переменных).

Все вызовы функции в С являются вызовами по значению. Выражения, которые используются при вызове функции, называются аргументами. Имена переменных, которые вместе со своими типами записываются в ее определении, называют параметрами. Параметры – это переменные, имена которых используются в операторах функции в качестве ссылок на поступившие аргументы. Параметры получают свои значения при вызове функции путем копирования значений соответствующих аргументов..

Итак, механизм передачи значений некоторого аргумента заключается в следующем:

- в случае, если аргумент, есть имя некоторой переменной или является выражением, то осуществляется копирование значения в стек на место соответствующего параметра – передача по значению.

- если в качестве параметра используется адрес передаваемого аргумента, то в стек помещается адрес, по которому записано значение этого аргумента – передача по ссылке.

Функции. Передача массивов.

Если в качестве передаваемого аргумента используется массив данных, то в функцию передается только указатель на массив, т.е. адрес первого элемента. При вызове функции в списке аргументов записывается имя массива. Имя массива без индекса является адресом элемента с нулевым индексом.

С автоматически передает массив в функцию путем передачи параметров по ссылке – при этом вызываемые функции могут изменять значения элементов в исходных массивах вызывающих функций.

Передача массивов посредством передачи по ссылке имеет смысл по соображениям эффективности. Если бы массивы передавались по значению, передавалась бы копия каждого элемента. Для больших, часто передаваемых массивов это было бы расточительно по времени и приводило бы к расходу значительного объема памяти для хранения их копий.

Можно использовать три варианта описания массива, поступающего в функцию, в качестве параметра:

1. Параметр в функции может быть объявлен как массив соответствующего типа с указанием его размера.

Пример: в функции вычислить сумму элементов каждой строки матрицы и сумму вывести на экран.

Возможные варианты объявления функции:

 

int sum(int x[]);

int sum(int*);

int sum(int[]);

 

#include<iostream.h>

int sum(int x[5]) // определение функции, размер указан.

{ int res=0;

for(int i=0;i<5;i++)

res+=x[i];

return res;

}

void main()

{int i, mas[3][5]={1,1,1,1,1,2,2,2,2,2,3,3,3,3,3};

for(i=0;i<3;i++)

cout<<"res="<<sum(mas[i]);

}

res=5 res=10 res=15

В этом случае С автоматически преобразует mas[i] к указателю на целый тип и в функцию передается адрес первого элемента каждой строки матрицы, т.е. адрес элемента mas[i][0].

2. Массив в качестве параметра в функции может быть объявлен без указания его размера. Т.к. сам массив в стек не копируется, то размер массива в общем случае компилятору не требуется. Контроль правильности использования индекса возлагается на программиста. В этом случае также используется указатель на первый элемент массива.

 

 

int sum(int x[]) // определение функции, размер не указан.

{ int res=0;

for(int i=0;i<5;i++) // i<5 известно программисту

res+=x[i];

return res;

}

 

3. Этот способ используется при написании профессиональных программ – объявление параметра массива указателем на соответствующий тип данных.

 

int sum(int *x) // определение функции.

{ int res=0;

for(int i=0;i<5;i++)

res+=x[i]; // можно res+=*x++

return res;

}

Область существования имени.

Имя-это идентификатор, который можно присвоить переменной, функции, типу данных, классу или объекту. После того, как имя было объявлено его можно использовать в программе. Но использовать можно в некоторых частях программы, которые называются Областью существованию имени!

Виды областей:

1)Блок операторов { ……..

……. }

Тело любой функции является блоком!

2)Функция (Только имена меток перехода goto …)

Void f()

{………..

Goto lab;

……………

{……..lab:……} ……}

3)Прототип функции: int F(int a, double b);

Область видимости имени.

Если используя имя, можно получить доступ к элементу, с которым это имя сопоставлено, то говорят,что имя находится в ОБЛАСТИ ВИДИМОСТИ

Область существования всегда шире области видимости!!!!!!!

Классы памяти.

Каждая переменная и функция, описанная в программе на языке С принадлежит к какому-нибудь классу памяти. Класс памяти переменной определяет время ее существования (жизни) и область действия (видимости). Время существования это время, в течении которого данная переменная существует в памяти. Область действия характеризует возможность обращения к переменной из различных частей программы. Класс памяти задается либо по расположению объявления, что связано с понятием блока программы, либо при помощи специального спецификатора класса памяти, располагаемого перед обычным описателем.

С поддерживает четыре класса памяти, обозначаемые спецификаторами класса памяти:

· auto – автоматический, локальный.

· register – регистровый.

· extern – глобальный, внешний.

· static – статический.

Четыре спецификатора класса памяти могут быть разбиты на два типа по периоду хранения: автоматический период хранения и статический период хранения. Для объявления переменных с автоматическим периодом хранения служат ключевые слова auto и register. Ключевые слова extern и static используются для объявления переменных и функций со статическим периодом хранения.



Поделиться:


Последнее изменение этой страницы: 2016-04-08; просмотров: 347; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.106.241 (0.012 с.)