Стандартные функций со строками


С++ поддерживает широкий диапазон функций для манипуляций со строками. Самые известные из них:strcpy( )

strcat( )

strcmp( )

strlen( )

Все строковые функции используют один и тот же заголовок <cstring>. Рассмотрим эти функции подробнее.

Вызов функции strcpy( )выглядит таким образом:strcpy (куда, откуда)

Функция strcpy( ) копирует содержимое строки откуда в строку куда. Не забывайте, что массив, образующий куда, должен иметь достаточный размер, чтобы в него поместилась строка откуда. Если места в нем не хватит, то произойдет выход за пределы массива куда, что скорее всего, приведет к аварийному завершению программы.

Вызов функции strcat( )выглядит таким образом: strcat(s1,s2);

Функция strcat() присоединяет строку s2 к концу s1; строка s2 остается без изменений. Вы должны обеспечить достаточно большой размер строки s1, чтобы она могла вместить как свое исходное содержимое, так и содержимое s2.

Вызов функции strcmp( )выглядит таким образом: strcmp(s1,s2);

Функция strcmp() сравнивает две строки и возвращает 0, если они равны. Если s1 больше s2 лексикографически (т. е. по порядку следования символов алфавита), возвращается положительное число; если она меньше s2, возвращается отрицательное число.

При использовании strcmp() важно иметь в виду, что при равенстве строк она возвращает false. Таким образом, если вы хотите, чтобы что-то произошло при равенстве строк, вам придется использовать оператор !. В следующем примере условие, управляющее предложением if, истинно, если str равна строке "С++":

if(!strcmp(str, "С++") cout << "str = С++";

Общая форма вызова функции strlen( ) такова: strlen(s);

Здесь s — это строка. Функция strlen() возвращает длину строки, на которую указывает s.

 

Строки

Безусловно, наиболее важным применением одномерных массивов является создание символьных строк. С++ поддерживает строки двух видов. Первый, наиболее часто используемый, — это строка с завершающим нулем или, другими словами, массив символов, заканчивающийся нулем. Строка с завершающим нулем содержит символы, образующие эту строку, за которыми помещается ноль. Такие строки пользуются чрезвычайно широко, так как они обеспечивают высокий уровень эффективности и предоставляют программисту возможность выполнять разнообразные строковые операции. Когда программист на С++ использует термин "строка", он (или она) обычно имеет в виду и именно строку с завершающим нулем. Второй вид строк, определенный в С++ — это класс string, который входит в библиотеку классов С++. Таким образом, string не является встроенным типом. Класс string позволяет использовать объектно-ориентированный подход при обработке строк, однако он используется не так широко, как строка с завершающим нулем. Здесь мы рассмотрим первый вид строк.

Основы техники строк

Объявляя символьный массив, который будет содержать строку с завершающим нулем, нужно задать ему длину на один символ больше, чем у самой длинной помещаемой в него строки. Если, например, вы хотите объявить массив str, в котором будет находиться 10-символьная строка, то вы должны написать следующее:char str[11] ;

Задание величины 11 в качестве длины массива обеспечит в строке место для завершающего нуля.

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

“Hello!” “I like C++” “Mars” “”

Добавлять ноль в конец строки вручную нет необходимости; компилятор С++ сделает это сам. В результате строка "Mars" будет выглядеть в памяти таким образом:

Последняя строка в нашем примере выглядит как "". Такая строка называется нулевой строкой. Она содержит только завершающий ноль и больше ничего. Нулевые строки используются в программах в качестве пустых строк.

 

Структура программы

Программа құрылымы:

Тақырыптарды жариялау блогы

Класстар, функциялар жариялау блогы

Бас функция main блогы

Функциялардың ісін анықтау блогы

С++ тілінің синтаксисі

Бас әріп және жай әріп әртүрлі символ ретінде қарастырылады

Идентификаторды жазу үшін латын әріптерді, цифрлар мен астын сызу символы пайдаланылады

Идентификаторды әріптен бастауға және ид-р ішінде бос орын қалдыруға болмайды

Комментарийдің 2 түрі бар: 1) 1 жолды комментарий //, 2) көп жолды /* мында коммент жазылад*/

1 жолға бірнеше оператор жазуға болады

// Sample.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <iostream>

using namespace std;

int main()

{ cout << "Hello World!";

char ch;

cin >> ch;

return 0;}

Изучим структуру консольной программы. В ее начале имеются такие строки:

// - - - - - - - - - - - - - - - - - - -

Этот текст является так называемым комментарием и не влияет на работу программы. Комментарий в программе на языке C+ + представляет собой пояснительный текст. Комментарии всегда пропускаются компилятором. Программист добавляет комментарии, чтобы сделать программу более наглядной.

Обычно комментарии начинаются с двух символов // и весь последующий текст до конца строки считается комментарием. Допускаются также многострочные комментарии. Они заключаются в пары символов /* и */. Все, что записано внутри них, считается комментарием.

Первая команда

#include "stdafx.h"

инструктирует компилятор о способе оптимального хранения содержимого так называемых заголовков (файлов, описывающих внешние подключаемые библиотеки программ).

Язык С++ определяет несколько заголовков, которые содержат информацию либо необходимую, либо полезную для вашей программы. Заголовки включаются в программу с помощью директивы #include.

Следующая команда

#include <iostream>

требует подключения заголовка <iostream>, который поддерживает систему ввода-вывода С++. Этот заголовок поставляется вместе с компилятором.

Далее в программе стоит такая строка:

using namespace std;

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

Следующая строка представляет собой начало программы:

int main ( )

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

Далее в программу включена строка:

cout << "Hello World!";

Это предложение консольного вывода. Оно приводит к выводу на экран сообщения Hello World!. Вывод на экран осуществляется с помощью оператора вывода <<. Оператор << действует так, что выражение (каким бы оно ни было), стоящее справа от него, выводится на устройство, указанное слева, cout представляет собой предопределенный идентификатор, обозначающий консольный вывод, который, как правило, закреплен за экраном. Таким образом, рассматриваемое предложение выводит на экран сообщение. Заметьте, что это предложение заканчивается знаком точки с запятой. Так заканчиваются все предложения С ++.

Сообщение " Hello World!" представляет собой строку. В С++ строкой называется последовательность символов, заключенная в двойные кавычки. Строки широко используется в программах на С++.

Строки

char ch;

cin >> ch;

приостанавливают выполнение программы, пока не будут введены любые символы(можно также нажать клавишу <Enter>).

Следующая строка программы осуществляет выход из main():

return 0;

Эта строка завершает функцию main() и заставляет ее вернуть значение 0 в вызывающий процесс (которым обычно является операционная система). Для большинства операционных систем возвращаемое значение 0 указывает на то, что программа завершается правильно. Другие значения свидетельствуют о завершении программы в результате возникновения какой-либо ошибки, return является одним из ключевых слов С++ и используется для возврата значения из функции. Все ваши программы должны при нормальном (т. е. без ошибок) завершении возвращать 0.

Завершающая фигурная скобка в конце программы формально заканчивает программу.

 

Тип данных

Деректер типі – сәйкес типті айнымалының мүмкін мәндерінің жиыны. Деректер типінің 2 түрі бар: қарапайым, құрама.

С++ тілінде 8 негізгі қарапайым деректер бар:

int - Бүтін сандар,

float - Бөлшек сандар

double - Дәлдігі жоғары, диапозоны үлкен бөлшек сандар

char - Символдық тип

wchar_t - Юникод – 2 байттық символ

bool - Логикалық тип

void - Бос тип

string - Жолдық (строчный) тип

Деректер типімен бірге олардың диапозонын өзгерту үшін 4 модификатор қолданылады: 1)short , 2) long, 3)signed(таңбалы), 4)unsigned(таңбасыз(оң))

Int типімен модификаторлардың төртеуі де қолданылады, char типімен signed, unsigned; double типімен float модификаторы қолданылады

 

Тернарный условный оператор

Условный оператор ? — единственный оператор в языке C++, который работает сразу с тремя операндами. Он получает три выражения и возвращает значение:

(выражение1) ? (выражение2): (выражениеЗ)

Эту строку можно прочитать так: "Если выражение1 истинно, возвратить значение выражения2, в противном случае возвратить значение выражения3". Как правило, это значение присваивается переменной. Следующий пример демонстрирует применение условного оператора ? вместо оператора if..else.

stroka =(grade >=60) ? “зачет”: “незачет”;

cout << stroka;

 

Указатель

— это переменная, содержащая адрес памяти другой переменной. Общая форма объявления переменной-указателя такова:тип * имя-переменной;

Здесь тип — это базовый тип указателя. Базовый тип определяет, на данные какого типа будет указывать этот указатель. имя-переменной - это имя переменной-указателя. Так, чтобы объявить ip, как указатель на int, вы должны написать:int *ip;

Поскольку базовым типом ip указан int, этот указатель можно использовать только для указания на переменные типа int.

Теперь объявим указатель на float: float *fp;

В этом случае базовым типом fp является float, и указатель fp может указывать только на переменные типа float.

Операторы указателей

Для использования с указателями предусмотрены два специальных оператора: * и &. Оператор & возвращает адрес памяти, в которой расположен его операнд. Например, предложение ptr = &total;

помещает в ptr адрес памяти, где находится переменная total. Этот адрес является адресом ячейки памяти, в которой хранится переменная total. Этот адрес не имеет ничего общего со значением total. Про операцию & можно сказать, что она возвращает адрес переменной, перед которой она указана. Таким образом, приведенное выше предложение присваивания можно передать словами, как "ptr получает адрес total". Чтобы лучше разобраться в этом присваивании, предположим, что переменная total расположена по адресу 100. Тогда после выполнения присваивания ptr будет иметь значение 100.

Второй оператор, *, в некотором роде обратный по отношению к &. Этот оператор возвращает значение переменной, расположенной по адресу, который указан в качестве операнда этого оператора. Продолжая тот же пример, если ptrсодержит адрес переменной total, то предложение

val = *ptr;

поместит значение переменной total в val. Если, например, total первоначально имела значение 3200, то valбудет теперь иметь то же значение 3200, потому что это значение, которое хранится в памяти по адресу 100, т. е. по адресу, который присвоен переменной ptr. Операцию *можно назвать "по адресу". Таким образом, последнее предложение можно передать словами, как "val получает значение, расположенное по адресу ptr".

int main()

{

int total;

int *ptr;

namespace std;

Приведенная

ниже программа выполняет последовательность только что описанных операций:

#include <iostream>

using

int val;

total = 3200; // присвоим total значение 3200

ptr = &total; // получим адрес total

val = *ptr; // получим значение по этому адресу

cout << "total равно: " << val << '\n';

return 0 ;

}

 

Функция

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

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

С использованием функций в языке C связаны три понятия: определение (описание действий, выполняемых функцией), объявление (задание формы обращения к функции) и вызов.

В определении (описании) функции должны присутствовать:

· имя;

· типы, имена и количество ее формальных параметров;

· объявления переменных и операторы (тело функции).

Кроме того, в определении могут быть заданы тип значения, возвращаемого функцией, и класс памяти:

int rus(unsigned char c) /* Определение функции, проверяющей, является ли заданный символ заглавной русской буквой */

{

if (c>='А' && c<='Я')

return 1;

else

return 0;

}

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

Объявление функции называется прототипом функции.

В прототипе функции (в C++ прототип обязателен) должны присутствовать:

- имя функции;

- типы и число формальных параметров;

- тип возвращаемого значения.

Формат прототипа тот же, что и у определения функции, но прототип не имеет:

- тела функции;

- заголовок оканчивается точкой с запятой.

Формальные параметры прототипа могут иметь имена, но они компилятору не нужны. Так, например, прототип рассмотренной выше функции может иметь вид:

int rus(unsigned char);или int rus(unsigned char с);

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

Определение функции

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

Формат определения:

<тип> имя (список формальных параметров)

{

тело функции

}

Функция может возвращать значение любого типа. Если тип не задан, то по умолчанию функция возвращает значение типа int.

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

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

Если оператор return не содержит выражения или выполнение функции завершается после выполнения последнего ее оператора (без выполнения оператора return), то возвращаемое значение не определено. Для функций, которые не должны ничего возвращать, может быть использован тип void, указывающий на отсутствие возвращаемого значения.

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

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

Такой функции может быть передано большее число аргументов, но над дополнительными аргументами не проводится контроль типов, например,

void fn(unsigned c,float b,int a,…); т. е. число аргументов функции fn³3.

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

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

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

Пример передачи в функцию параметров-значений b и c:

int fn1(int b,float c);

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

В качестве такого параметра можно использовать указатель на некоторую переменную:

int fn2(int* pb);

Используя операцию косвенной адресации в теле функции, можно изменить значение этой переменной: *pb=6.

Другой способ передачи в функцию адреса переменной – передача параметра по ссылке, при этом в вызванной функции создается псевдоним исходной переменной, форма обращения к такому параметру-ссылке такая же, как и к обычной переменной, а сам параметр передается с помощью адреса, например, int fn3(int &ab);при этом обращение к переменной ab в теле функцииfn3() такое же, как к обычной переменной типа int.

Тело функции – это составной оператор, содержащий объявления переменных (если необходимо), и операторы.

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

Рассмотрен современный способ определения функции, но существует и другой способ определения – устаревший (так называемый «старый стиль»). Различия между стилями проявляются в описании аргументов функции.

В старом стиле типы параметров объявляются перед телом функции:

float root(x,E)

float x,E;

{

тело функции

}

В новом стиле типы параметров указываются в списке параметров:

float root(float x, float E)

{

тело функции

}

 

 









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

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь