Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_ПВМ.doc
Скачиваний:
5094
Добавлен:
21.02.2016
Размер:
2.79 Mб
Скачать

Тема 9. Символы и строки в Си.

Объявление строки символов.Имеется несколько способов определения строк. К основным способам относятся использование строковых констант, массивов типаcharи массивов, состоящих из символьных строк. Строковая константа заключается в двойные кавычки. Символы, заключенные в кавычки, и завершающий символ ‘\0’ записываются в последовательные ячейки памяти. Компилятор подсчитывает количество символов для определения размера памяти при запоминании (размещении) строки. Строковые константы можно определять при помощи директивы #define. Если в строке нужно использовать символ двойной кавычки, то перед этим символом записывается символ обратной дробной черты. Например:

printf(“\” Сведения о сессии”\n”);

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

charc[ ]=”Определение максимального балла”; (внешний массив)

Как и в случае обычных массивов имя cявляется указателем на первый элемент массива:

c==&c[0]; *c==’0’, и *(c+1)==c[1]==’n’;

Используем указатель для создания строки. Например:

char*c1=”\nввод баллов”;

Это почти то же самое, что и

static char c1[ ]=”\n ввод баллов”;

Оба описания говорят об одном: с1 является указателем строки. Можно явно задать размер памяти. Во внешнем описании можно записать:

charc[35]=”определение максимального балла”; вместо

charc[ ]=”определение максимального балла”;

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

Массивы символьных строк. Рассмотрим массив символьных строк, каждая строка массива представляет собой символьный массив. Приведем описание статического массива в следующем виде:

staticchar*m[4]={“регистр”,”ячейка”,”указатель”,”элемент”};

Массив *m[4]является массивом, состоящим из 4 указателей на символьные строки. Итак, т.к. символьные строки являются массивами, то имеется в рассмотрении 4 указателя на эти массивы. Первым указателем являетсяm[0], он ссылается на первую строку. Второй указательm[1] ссылается на вторую строку. При этом каждый указатель, в частности, ссылается на первый символ своей строки:

*m[0]==’р’; *m[1]==’я’; *m[2]==’у’; *m[3]==’э’;

инициализация выполняется по правилам, определенным для массивов. Тексты в кавычках эквивалентны скобочной записи:

{{…},{…},…,{…}};

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

static char m[4][10];

неиспользованные (лишние) элементы строки статического (внешнего) массива инициализируются символом “\0” (нуль-символом).

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

staticchar*[4];

Здесь длина каждой строки определяется конкретной строкой, которая инициализирует соответствующую строку массива.

Библиотека обработки символов. Библиотека обработки символов включает в себя несколько функций, выполняющих ряд полезных проверок и операций с символьными данными. Каждая функция получает в качестве аргумента символ – представляемый типом int – или индикатор EOF (конец файла). Для работы с функциями библиотеки обработки символов надо подключить заголовочный файл <ctype.h>. В таблице 2 приведен перечень функций библиотеки обработки символов.

Таблица 2 – Функции библиотеки обработки символов

Прототип

Описание функции

int isdijit (int c)

Возвращает значение true, если с является цифрой, и 0 (false) в других случаях.

int isalpha (int c)

Возвращает значение true, если с является буквой, и 0 в других случаях.

int isalnum (int c)

Возвращает значение true, если с является цифрой или буквой, и 0 в других случаях.

int isxdijit (int c)

Возвращает значение true, если с является одним из символов шестнадцатеричного формата, и 0 в других случаях.

int islower (int c)

Возвращает значение true, если с является буквой нижнего регистра, и 0 в других случаях.

int isupper (int c)

Возвращает значение true, если с является буквой верхнего регистра, и 0 в других случаях.

int tolower (int c)

Если с является буквой верхнего регистра, то tolower возвращает с как букву нижнего регистра. В других случаях tolower возвращает аргумент без изменений.

int toupper (int c)

Если с является буквой нижнего регистра, то toupper возвращает с как букву верхнего регистра. В других случаях toupper возвращает аргумент без изменений.

int isspace (int c)

Возвращает значение true, если с является пробельным символом – пробел (' '), новая страница (‘\f’), новая строка (‘\n’), возврат каретки (‘\r’), горизонтальная табуляция (‘\t’) или вертикальная табуляция (‘\v’) – и 0 в других случаях.

int iscntrl (int c)

Возвращает значение true, если с является управляющим символом, и 0 в других случаях.

int ispunct (int c)

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

int isprint (int c)

Возвращает значение true, если с является отображаемым при печати символом, включая символ пробела (' '), и 0 в других случаях.

int isgraph (int c)

Возвращает значение true, если с является отображаемым при печати символом, исключая символ пробела (' '), и 0 в других случаях.

Функции преобразования строк. Для работы с функциями преобразования строк необходимо подключить заголовочный файл <stdlib.h>. Эти функции преобразуют строки цифр в целые значения и значения с плавающей точкой. В таблице 3 приведен перечень функций преобразования строк.

Таблица 3 – Функции преобразования строк

Прототип

Описание функции

double atof (const char *nPtr)

Преобразует строку nPtr в тип double.

int atoi (const char *nPtr)

Преобразует строку nPtr в тип int.

long atol (const char *nPtr)

Преобразует строку nPtr в тип long int.

double strtod (const char *nPtr, char **endPtr)

Преобразует строку nPtr в тип double.

long strtol (const char *nPtr, char **endPtr, int base)

Преобразует строку nPtr в тип long.

unsigned long strtoul (const char *nPtr, char **endPtr, int base)

Преобразует строку nPtr в тип unsigned long.

Функции стандартной библиотеки ввода/вывода. Стандартная библиотека ввода/вывода <stdio.h> также содержит несколько функций, которые предназначены для работы с символьными и строковыми данными. В таблице 4 приведен перечень функций ввода/вывода символов и строк из стандартной библиотеки ввода/вывода.

Таблица 4 – Символьные и строковые функции стандартной библиотеки ввода/вывода

Прототип

Описание функции

int getchar (void)

Вводит следующий символ со стандартного устройства ввода и возвращает его в формате целого.

char *gets (char *s)

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

int putchar (int c)

Печать символа, хранящегося в с.

int puts (const char *s)

Печать строки s с последующим символом новая строка.

Прототип

Описание функции

int sprintf (char *s, const char *format, …)

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

int sscanf (char *s, const char *format, …)

Эквивалент функции scanf за исключением того, что ввод осуществляется из массива s, а не с клавиатуры.

Основная литература: 1осн[325-355],2осн[371-405]

Дополнительная литература:10доп[46-51], 11доп[13-16]

Контрольные вопросы:

1. Назовите различные способы определения строки?

2. Какие функции содержит стандартная библиотека ввода/вывода <stdio.h>?

3. Какой заголовочный файл необходимо подключить для работы с библиотекой преобразования строк?

4. Какой заголовочный файл необходимо подключить для работы с библиотекой обработки символов?

5. Какие функции используются для изменения регистров символа?

Тема 10. Функции операции над строками.

Функции операций над строками из библиотеки обработки строк. Библиотека обработки строк содержит множество полезных функций для выполнения операций со строковыми данными, для сравнения строк, для поиска символов и других строк в строке, для деления строки на лексемы (логические части) и определения строки. Для работы с библиотекой обработки строк необходимо подключить заголовочный файл <string.h>. Перечень этих функций приведен в таблице 5.

Таблица 5 – Функции из библиотеки обработки строк

Прототип

Описание функции

char *strcpy(char *s1, const char *s2);

Копирует строку s2 в строку s1. Возвращает значение s1. Функция пред­полагает, что строка s1 имеет размер, достаточный для того, чтобы вместить содержимое строки s2.

char *strncpy(char *s1, const char *s2, size_t n);

Копирует не более n символов из строки s2 в строку s1. Возвращает значение s1.

char *strcat(char *s1, const char *s2);

Объединяет строку s2 со строкой s1. Первый символ строки s2 переписывает символ NULL строки s1. Возвращает значение s1.

Прототип

Описание функции

char *strncat(char *s1, const char *s2, size_t n);

Объединяет не более n символов строки s2 со строкой s1. Первый символ строки s2 переписывает символ NULL строки s1. Возвращает значение s1.