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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

static char m[4][10];

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

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

static char *[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. Какие функции используются для изменения регистров символа?