Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций -=Вычислительная техника и прог...docx
Скачиваний:
11
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

6.3. Строки: операции с текстовыми файлами

Строка представляет собой массив символов, заканчивающийся нуль-символом ‘\0’, который является терминатором строки, т.е. признаком конца строки.

Примечание:

— из определения строки следует, что при объявлении строкового массива из 100 байт, в нем можно хранить строку длиной 99 символов, а один байт отводится под нуль-символ.

6.3.1. Операции над строками

В таблице 6.2 представлены допустимые операции для строк.

Таблица 6.2 — Допустимые операции для строк

Операция

Действие

Операция

Действие

=

Присваивание

<=

Меньше или равно

+

Конкатенация

>

Больше

+=

Добавление

>=

Больше или равно

==

Равенство

[ ]

Индексация

!=

Неравенство

<<

Вывод

<

Меньше

>>

Ввод

Кроме перечисленных в таблице операций библиотека <stdlib.h> содержит функции преобразования строк в числа:

double atof (const char *string) ;

int atoi (const char *string) ;

long atol (const char *string) ;

Примечания:

— функция atof преобразует строку string в тип double;

— функция atoi преобразует строку string в тип int;

— функция atol преобразует строку string в тип long;

— обратное преобразование возможно с помощью функции sprintf().

6.3.2. Методы и функции ввода и вывода строк

Кроме методов и функций ввода и вывода строк, рассмотренных выше, существуют еще методы неформатированного чтения из потока.

Формат методов неформатированного чтения из потока:

get (char *buffer, int N, char ‘lim’) ;

getline (char *buffer, int N, char ‘lim’) ;

Примечания.

Функция get считывает или N–1 символов из потока, или пока не встретится символ ‘lim’, и копирует их в символьную строку buffer. Вместо символа ‘lim’ в строку buffer записывается признак конца строки ‘\0’. В программу возвращает ссылку на текущий поток.

Функция getline аналогична функции get, но копирует в строку buffer символ ‘lim’.

Также существуют функции форматированного чтения из строки и записи в строку.

Формат записи функций форматированного чтения из строки и записи в строку:

int sprintf (char *buffer, const char *format [,arg, …]) ;

int sscanf (char *buffer, const char *format [,addr, …]) ;

Примечания:

— функция sprintf выводит в строку buffer значения переменных arg, … в формате, определенном строкой format;

— функция sscanf считывает данные из строки buffer в формате, определенном строкой format, и передает их переменным по адресам addr, …;

— параметры форматирования данных в функциях sprintf и sscanf аналогичны параметрам функций printf и scanf.

6.3.3. Функции работы со строками библиотеки <string.h>

В библиотеке <string.h> хранится широкий набор функций для работы со строками. Рассмотрим некоторые их них.

Формат записи функции добавления strcat:

char *strcat (char *dest, const char *str) ;

Примечание.

Функция добавляет в конец строки dest строку str и ‘\0’, результат записывает в dest.

Формат записи функции добавления с определением максимального количества добавляемых символов strncat:

char *strncat (char *dest, const char *str, size_t N) ;

Примечание.

Функция добавляет в конец строки dest не более N символов строки str и ‘\0’, результат записывает в dest.

Формат записи функции копирования strcpy:

char *strcpy (char *dest, const char *str) ;

Примечание.

Функция копирует в строку dest строку str, включая ‘\0’.

Формат записи функции копирования с определением максимального количества копируемых символов strncpy:

char *strncpy (char *dest, const char *str, size_t N) ;

Примечания:

— функция копирует в строку dest не более N символов строки str;

— если длина строки str больше или равна N, то символ ‘\0’ в конец строки dest не добавляется, в противном случае строка dest дополняется символами ‘\0’ до N-го символа.

Формат записи функции поиска символа в строке strchr:

char *strchr (const char *str, char *ch) ;

Примечания:

— функция возвращает указатель на первое найденное вхождение (положение) символа ‘ch’ в строке str, если нет искомого символа, то возвращает NULL;

— функция производит поиск в прямом направлении.

Формат записи функции поиска символа в строке в обратном направлении strrchr:

char *strrchr (const char *str, char *ch) ;

Примечания:

— функция аналогична функции strchr();

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

Формат записи функции поиска (проверки на отсутствие) strspn:

size_t strspn (const char *str1, char *str2) ;

Примечаниe.

Функция возвращает индекс первого символа строки str1, отсутствующего в str2.

Формат записи функции поиска (проверка на совпадение) strсspn:

size_t strсspn (const char *str1, const char *str2) ;

Примечание.

Функция возвращает индекс первого символа строки str1, совпадающего с любым из символов строки str2.

Формат записи функции поиска (проверка на присутствие символа) strсpbrk:

char *strсpbrk (const char *str1, const char *str2) ;

Примечания:

— функция возвращает указатель на символ, являющийся первым вхождением любого из символов из str2 в строку str1;

— если одинаковых символов нет, то возвращается NULL.

Формат записи функции поиска (проверка на присутствие подстроки) strstr:

char *strstr (const char *str1, const char *str2) ;

Примечания:

— функция выполняет поиск первого вхождения подстроки str2 в строку str1;

— функция возвращает указатель на элемент из str1, с которого начинается str2, в случае удачного поиска и NULL в случае неудачного поиска.

Формат записи функции сравнения строк (с учетом регистра) strcmp:

int strcmp (const char *str1, const char *str2) ;

Примечание.

Функция сравнивает строки с учетом регистра символов и возвращает:

— значение < 0, если str1 < str2;

— значение = 0, если str1 == str2;

— значение > 0, если str1 > str2.

Формат записи функции сравнения строк (без учета регистра) stricmp:

int stricmp (const char *str1, const char *str2) ;

Примечание.

Функция сравнивает строки без учета регистра символов и возвращает значения аналогичные функции strcmp().

Формат записи функции сравнения строк с частью другой строки (с учетом регистра) strncmp:

int strncmp (const char *str1, const char *str2, size_t N) ;

Примечания:

— функция сравнивает строку str1 и первые N символов строки str2 с учетом регистра символов;

— функция возвращает значения аналогичные функции strcmp().

Формат записи функции сравнения строки с частью другой строки (без учета регистра) strnicmp:

int strnicmp (const char *str1, const char *str2, size_t N) ;

Примечания:

— функция сравнивает строку str1 и первые N символов строки str2 без учета регистра символов;

— функция возвращает значения аналогичные функции strcmp().

Форматы записи функции выделения лексемы strtok:

char *strtok (char *str1, const char *str2) ;

char *strtok (NULL, const char *str2) ;

Примечания:

— при использовании первого варианта формата записи функция сравнивает лексему из str1, отделенную началом str1 и любым символом из набора str2; при этом в строку str1 функция вставляет символ NULL непосредственно за последним символом лексемы

— второй вариант формата записи используется только при повторном вызове; при этом функция возвращает лексему из str1, отделенную любым символом из набора str2 и окончанием str1.

Формат записи функции вычисления длины строки strlen:

char *strlen (const char *string) ;

Примечание.

Функция возвращает длину строки string.

6.3.4. Функции классификации и преобразования символов библиотеки <ctype.h>

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

Формат записи функции классификации символов (букв или цифр) isalnum:

int isalnum (int ch) ;

Примечания:

— проверяет, является ли символ буквой или цифрой;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой или цифрой, или false в противном случае.

Формат записи функции классификации символов (букв) isalpha:

int isalpha (int ch) ;

Примечания:

— проверяет, является ли символ буквой;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой, или false в противном случае.

Формат записи функции классификации символов (букв нижнего регистра) islower:

int islower (int ch) ;

Примечания:

— проверяет, является ли символ буквой нижнего регистра;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой нижнего регистра, или false — в противном случае.

Формат записи функции классификации символов (букв верхнего регистра) isupper:

int isupper (int ch) ;

Примечания:

— проверяет, является ли символ буквой верхнего регистра;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой верхнего регистра, или false в противном случае.

Формат записи функции классификации символов (цифр) isdigit:

int isdigit (int ch) ;

Примечания:

— проверяет, является ли символ цифрой;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является цифрой, или false в противном случае.

Формат записи функции классификации символов (шестнадцатеричных цифр) isxdigit:

int isxdigit (int ch) ;

Примечания:

— проверяет, является ли символ шестнадцатеричной цифрой;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является символом шестнадцатеричной цифры, или false в противном случае.

Формат записи функции классификации символов (пунктуации) ispunct:

int ispunct (int ch) ;

Примечания:

— проверяет, является ли символ символом пунктуации;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является символом пунктуации, или false в противном случае.

Формат записи функции классификации символов (разграничителей) isspace:

int isspace (int ch) ;

Примечания:

— проверяет, является ли символ разграничительным;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является пробелом или табуляцией, или символом новой строки или страницы (9 … 13, 32) или false в противном случае.

Формат записи функции классификации символов (ASCII) isascii:

int isascii (int ch) ;

Примечания:

— проверяет, принадлежит ли символ таблице ASCII;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является символом таблицы ASCII (0 … 127), или false в противном случае.

Формат записи функции классификации символов (управляющих) iscntrl:

int iscntrl (int ch) ;

Примечания:

— проверяет, является ли символ управляющим;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является управляющим (127, 0 … 31), или false в противном случае.

Формат записи функции классификации символов (видимых) iscntrl:

int isgraph (int ch) ;

Примечания:

— проверяет, является ли символ видимым;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является видимым (33 … 126), или false в противном случае.

Формат записи функции классификации символов (печатаемых) isprint:

int isprint (int ch) ;

Примечания:

— проверяет, является ли символ печатаемым;

— выделяет младший байт параметра ch и возвращает значение true, если символ ch является печатаемым (видимые+пробел: 32 … 126), или false в противном случае.

Формат записи функции преобразования символов (в символ нижнего регистра) tolower:

int tolower (int ch) ;

Примечания:

— функция преобразует символ в символ нижнего регистра;

— функция получает параметр ch и возвращает его в нижнем регистре;

— в параметре ch используется только младший байт.

Формат записи функции преобразования символов (в символ верхнего регистра) toupper:

int toupper (int ch) ;

Примечания:

— функция преобразует символ в символ верхнего регистра;

— функция получает параметр ch и возвращает его в верхнем регистре;

— в параметре ch используется только младший байт.

Формат записи функции преобразования символов (в символ ASCII) toascii:

int toascii (int ch) ;

Примечания:

— функция преобразует символ в символ таблицы ASCII;

— функция получает параметр ch и возвращает его в диапазоне значений таблицы ASCII (0 … 127).

Пример:

/* Пример использования функции tolower() : */

#include <string.h>

#include <stdio.h>

#include <ctype.h>

int main(void)

{

int length, i ;

char *string= “THIS IS A STRING.” ;

length=strlen(string) ;

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

{

string[i]=tolower(string[i]) ;

}

printf(“%s\n”, string) ;

return 0;

}

Результат выполнения программы:

this is a string.