- •1.1. Символьные данные и их представление в памяти эвм
- •1.2. Строковые данные и их представление в памяти эвм
- •1.3. Ввод текстовых данных во время работы программы
- •1.3.1. Форматный ввод
- •1.3.2. Потоковый ввод
- •1.3.3. Специальные функции ввода текстовых данных
- •1.4. Вывод текстовых данных
- •1.4.1. Форматный вывод
- •1.5.2. Операции над строковыми данными
- •1.6. Управление дисплеем в текстовом режиме
- •Примеры выполнения работы
- •Задание на лабораторную работу
- •Требования к отчету
- •Контрольные вопросы
1.5.2. Операции над строковыми данными
Для обработки строк, представленных одномерными символьными массивами, в библиотеке системных функций предусмотрено довольно много различных операций. Прототипы этих функций сгруппированы в заголовочном файле string.h и большинство их названий начинается с префикса str (от string). Условимся о некоторых обозначениях аргументов и их типах, чтобы не повторять их в приведенной таблице:
S, S1,S2 – указатель на символьный массив (как правило, имя массива);
CS – указатель типа const char * (т.е. неизменяемый массив или строковая константа – источник данных);
ch – код символа, обычно числовое значение типа int;
k – количество символов.
Таблица 2 |
|
Функция |
Выполняемое действие |
Определение длины строки |
|
strlen(CS) |
Возвращает количество символов в строке S |
Формирование строк |
|
strdup(CS) |
Запрашивает память, копирует туда содержимое CS и возвращает указатель типа char* на новую строку |
strcpy(S1,CS2) |
Копирует содержимое CS2 в S1, возвращает указатель на S1 |
strncpy(S1,CS2,k) |
Копирует первые k символов из CS2 в S1, возвращает указатель на S1 |
stpcpy(S1,CS2) |
Копирует CS2 в S1, возвращает указатель на конец S1 |
strset(S,ch) |
Расписывает строку S символом ch, возвращает указатель на S1 |
strnset(S,ch,k) |
Повторяет k раз символ ch в строке S, возвращает указатель на S1 |
Конкатенация строк |
|
strcat(S1,CS2) |
Приписывает содержимое CS2 в конец S1, возвращает указатель на S1 (длина массива S1 должна предусматривать такое расширение) |
strncat(S1,CS2,k) |
Присоединяет первые k символов CS2 к содержимому S1, возвращает указатель на S1 |
Смена регистра |
|
strlwr(S) |
замена символов строки S кодами малых букв, действует только на буквы латинского алфавита |
strupr(S) |
замена символов строки S кодами больших букв, действует только на буквы латинского алфавита |
Переворот строки |
|
strrev(S) |
Перестановка символов строки S в обратном порядке |
Преобразование в числовые данные |
|
strtol(CS,ptr,r) |
Число, представленное в символьном виде в CS и записанное в системе счисления с основанием r, преобразуется в машинный формат числа типа long. В указатель ptr заносится адрес символа, прервавшего преобразования. Возвращаемое значение – результат преобразования. |
strtoul(CS,ptr,r) |
Аналогичное преобразование в длинное целое число без знака |
strtod(CS,ptr) |
Преобразование вещественного числа из символьного представления в машинный формат числа типа double. |
Сравнение строк |
|
strcmp(CS1,CS2) |
Возвращаемое значение равно 0, если CS1=CS2, больше 0, если CS1>CS2, и меньше 0, если CS1<CS2 |
strncmp(CS1,CS2,k) |
Сравниваются только первые k символов строк CS1 и CS2 |
stricmp(CS1,CS2) |
При сравнении игнорируется разница между кодами больших и малых букв |
strcmpi(CS1,CS2) |
Аналогичная операция, разница только в названии функций |
strnicmp(CS1,CS2,k) |
Сравнение первых k символов с игнорированием разницы между кодами больших и малых букв |
strncmpi(CS1,CS2,k) |
Аналогичная операция, разница только в названии функций |
Поиск символа |
|
strchr(CS,ch) |
Строка CS сканируется слева направо до обнаружения символа ch. Если он найден, возвращаемый указатель "смотрит" на этот символ в строке CS, если такого символа нет, то возвращаемый указатель равен null (т.е. 0) |
strrchr(CS,ch) |
Аналогичный поиск с конца строки CS. |
Поиск строки |
|
strstr(CS1,CS2) |
Поиск первого вхождения строки CS2 в строку CS1. Если поиск завершен успешно, возвращается указатель на первый символ найденной подстроки. В противном случае возвращается null |
Специальный поиск |
|
strpbrk(CS1,CS2) |
В строке CS1 ищется первый символ, содержащийся в CS2. Возвращается указатель на найденный символ или null. |
strspn(CS1,CS2) |
Определяется длина начального фрагмента CS1, целиком состоящая из символов CS2 (порядок символов роли не играет) |
strcspn(CS1,CS2) |
Определяется длина начального фрагмента CS1, который не содержит ни одного символа из CS2 |
strtok(S1,CS2) |
Поиск в строке S1 лексем, разделенных символами CS2 |
Некоторые из функций, приведенные в табл. 2, нуждаются в дополнительных пояснениях.
В функциях strtol и strtoul, выполняющих преобразование символьного представления числа в соответствующий машинный формат, допускается задание r=0. В этом случае основание системы определяется символьной записью числа. Если строка начинается с символа '0', за которым следуют символы цифр, не превосходящих 7, то число считается восьмеричным. Если строка начинается с комбинации '0x' или '0X', вслед за которой располагаются шестнадцатеричные цифры, то считается, что r=16.
В функции strtok лексемой считается цепочка символов, завершающаяся одним из предусмотренных символов-разделителей. При первом обращении к этой функции в строке S1 находится начальная лексема и возвращаемое значение является указателем на ее начальный символ. Одновременно в строку S1 на место обнаруженного символа-разделителя заносится нулевой байт. Это позволит в дальнейшем работать с найденной лексемой как со строкой. Для поиска следующих лексем в повторных обращениях к функции strtok вместо первого аргумента нужно задавать нулевой аргумент. Функция будет искать следующую лексему, расположенную правее принудительно вставленного нулевого байта. И так можно последовательно обнаружить все лексемы, содержавшиеся в строке S1. Для пояснения приведем следующий пример:
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{ char *ptr;
ptr=strtok("FEB.14,2006",".,-/");
while(ptr!=NULL)
{ printf("ptr=%s\n",ptr);
ptr=strtok(NULL, ".,-/");
}
getch();
}
//=== Результат работы ===
ptr=FEB
ptr=14
ptr=2006