Лабораторная работа № 1-15

Работа с символьными строками в C

1. Цель работы

Целью работы является разработка, отладка и выполнение программы на C для операций над строками символов.

2. Состав рабочего места

2.1. Оборудование: IBM-совместимый персональный компьютер (ПК).

2.2. Программное обеспечение: операционная система Windows, интегрированная оболочка BorlandC++.

3. Краткие теоретические сведения

3.1. Ввод и вывод символов и строк

Чтение одного символа с клавиатуры можно выполнить как с помощью функции scanf(), та и с помощью функции

int getchar (void)

Эта функция не имеет параметров (часто параметр void опускается) и возвращает следующий символ ввода.

Функция

int putchar (int)

выводит символ на экран дисплея и, в качестве результата, возвращает посланный символ.

Функцию getchar() можно использовать для ввода нескольких символов.

Ввод символов будет продолжаться до тех пор, пока во входном потоке не встретится символ точки.

Функция getchar() распознает в качестве вводимого символа также символ конца файла (при вводе с клавиатуры в MS DOS и Windows этот символ генерируется при нажатии клавиш Ctrl+Z). Конец файла задается в C с помощью константы EOF, которая, как и функции getchar() и putchar(), определены в stdio. h. Кроме того, функция возвращает символ EOF в том случае, если при выводе символа произошла ошибка.

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

НЕ нашли? Не то? Что вы ищете?

Простейшее решение этой проблемы – включить в объявление явное указание размера массива.

Для ввода и вывода строк, помимо функций scanf() и printf() можно использовать также функции gets() и puts(). Эти функции также находится в разделе stdio. h стандартной библиотеки языка C.

Функция

char *gets (имя-строки)

получает строку из стандартного устройства ввода сис­темы (обычно клавиатуры). Поскольку строка не име­ет заранее определенной длины, функция gets() нужда­ется в способе определения момента прекращения своей работы. Она считывает символы до тех пор, пока не до­стигнет символа перевода строки "\n", который генери­руется путем нажатия клавиши Enter. Функция прини­мает все символы вплоть до символа перевода строки (но, не включая его), дописывает нулевой символ "\0" и пе­редает строку вызывающей программе.

Сам символ пе­ревода строки считывается и отбрасывается, поэтому следующее считывание начинается с начала следующей строки. Функция gets() возвращает значение указателя на введенную строку, что можно использовать для обработки строки.

Если файл ввода закончен или обнаружена ошибка, функция gets() возвращает значение NULL.

Функция

int puts(имя-строки);

выводит строку на стандартное устройство вывода системы (обычно дисплей). В отличие от функции printf(), при вы­воде функция puts() автоматически осуществляет пере­ход на новую строку. Функция puts() прекращает вывод, встретив символ "\0", поэтому необходимо, чтобы строка содержала такой символ. Функция возвращает последний записанный символ "\n" или EOF (в случае ошибки).

3.2. Функции обработки символов и строк символов

В стандартной библиотеке C есть следующие группы функций, оперирующих с символами и строками символов:

·  проверка символов и преобразование символов (раздел ctype. h);

·  преобразование строк в числовые данные и обратные преобразования (раздел stdlib. h);

·  операции над строками (раздел string. h);

·  операции над буферными областями (разделы string. h и mem. h).

Для функций определения класса символов, описанных в стандартной библиотеке, в качестве аргумента задаются значения типа int (проверяется только младший байт аргумента). Возвращаемое значение (типа int) равно 0, если условие проверки не выполняется и отлично от нуля в противном случае. В разделе библиотеки ctype. h определены следующие функции:

Имя функции

Действие функции

isalnum

Тест на символы A-Z, a-z, 0-9.

isalpha

Тест на буквы A-Z, a-z.

iscntrl

Тест на управляющие символы с кодами 0x00 – 0x1f и 0x7f.

isdigit

Тест на цифры 0-9.

isgraph

Тест на печатаемые символы, исключая пробел – 0x21 - 0x7e.

islower

Тест на буквы a-z.

isprint

Тест на печатаемые символы – 0x20-0x7e.

ispunct

Тест на символы – знаки пунктуации.

isspace

Тест на символ пробела.

isupper

Тест на буквы A-Z.

isxdigit

Тест на шестнадцатеричную цифру – 0-9, A-F.

Функция tolower() с аргументом типа int проверяет, является ли аргумент прописной буквой и, если является, буква переводится в нижний регистр. В противном случае функция возвращает значение аргумента.

Функция toupper() с аргументом типа int проверяет, является ли аргумент строчной буквой и, если является, буква переводится в верхний регистр. В противном случае функция возвращает значение аргумента.

Числа могут сохраняться как в форме строк, так и в форме цифр. Сохранение числа в виде строки означает сохранение цифровых символов. Например, число 213 может быть сохранено в массиве символьной строки в виде цифр '2', '1', '3', '\0'. Сохранение числа 213 в циф­ровой форме означает сохранение его, например, в ка­честве значения типа int.

В языке C цифровая форма требуется для выполне­ния таких цифровых операций, как сложение и сравне­ние, но отображение чисел на экране требует представ­ления в форме строки, поскольку на экране отображаются символы. Функции printf() и scanf() с помощью своих спецификаций преобра­зуют цифровые формы в строковые и наоборот.

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

Прототип функции

Действие функции

double atof (char *string)

Возвращает число с плавающей точкой типа double или 0, если преобразование невозможно.

int atoi (char *string)

Возвращает целое число или 0, если преобразование невозможно.

long atol (char *string)

Возвращает целое число типа long или 0, если преобразование невозможно.

char *itoa (int value, char *string, int radix)

Преобразует целое число, заданное в аргументе value, в строку символов *string в системе счисления radix (2 < radix < 36).

char *ltoa ( long value, char *string, int radix)

Аналогична функции itoa, но для длинных целых чисел.

char *ultoa (unsigned long value, char *string, int radix)

Аналогична функции itoa, но для длинных целых чисел без знака.

Операции над строковыми переменными, определенные в разделе string. h включают следующие функции:

Прототип функции

Действие функции

char *strcat (char *string1, char *string2)

Возвращает строку, являющуюся конкатенацией строк string1 и string2.

char *strchr (char *string, int symbol)

Возвращает указатель на первое вхождение symbol в string или NULL, если symbol не найден в string.

int strcmp (char *string1, char *string2)

Возвращает значение, большее 0, если string1>string2, равное 0, если string1==string2 и меньшее 0, если string1<string2.

char *strcpy (char *string1, char *string2)

Копирует string2 в string1 и возвращает string1.

int strcspn (char *string1, char *string2)

Возвращает длину начальной подстроки string1, не содержащей ни одного символа из string2.

int strlen (char *string)

Возвращает длину string в байтах.

char *strncat (char *string1, char *string2, n)

Аналогична функции strcat(), но оперирует с n символами строки string2.

int strncmp (char *string1, char *string2, n)

Аналогична функции strcmp(), но оперирует с n символами строки string2.

char *strncpy (char *string1, char *string2, n)

Аналогична strcpy(), но оперирует с n символами строки string2.

char *strset (char *string, int symbol)

Возвращает строку string, заполненную символами symbol.

char *strpbrk (char *string1, char *string2)

Возвращает указатель на первое вхождение любого символа из string2 в string1 или NULL, если нет общих символов.

char *strrchr (char *string, int symbol)

Возвращает указатель на последнее вхождение symbol в string или NULL, если нет общих символов.

int strspn (char *string1, char *string2)

Возвращает длину начальной подстроки string1, которая содержит только символы из string2.

char *strstr (char *string1, char *string2)

Возвращает указатель на первое вхождение строки string2 в string1 или NULL, если вхождение не найдено.

char *strtok (char *string1, char *string2)

При первом вызове функции для заданного значения параметра string1 и строки string2, содержащей символы-разделители слов для string, производится возврат указателя на первый символ string1. Чтобы найти начало следующего слова в string1, необходимо вызвать функцию со значением NULL для string1. Когда все слова в string1 исчерпаны, возвращается NULL.

4. Порядок выполнения работы

Порядок выполнения работы:

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

№ варианта

Операции над строками, выполняемые в программе

Вводимые данные

Выводимые данные

1.

Определить количество одинаковых слов в исходной строке.

исходная строка

общее количество слов в строке, количество одинаковых слов в строке

2.

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

исходная строка

сообщение "Правильное выражение" или "Нарушен баланс <тип> скобок", где тип - одно из слов: фигурных, круглых или квадратных

3.

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

исходная строка

преобразованная строка

4.

Определить функцию анализа строки, возвращающую 1, если строка содержит только русский или украинский текст, -1, если строка содержит только текст латинскими буквами и 0, если в тексте есть как буквы кириллицы, так и латинские буквы.

исходная строка

одно из сообщений "Русский или украинский текст", "Латинский текст" или "Многоязычный текст"

5.

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

исходная строка, проверяемая буква

количество повторений буквы в исходной строке

6.

Определить функцию, подсчитывающую количество повторений заданной цифры в строке.

исходная строка, проверяемая цифра

количество повторений цифры в исходной строке

7.

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

исходная строка,

заглавная буква

количества повторений буквы в исходной строке

8.

Определить позиции первого символа заданного слова в исходной строке (в строке может быть несколько одинаковых слов).

исходная строка, проверяемое слово

номера позиций первого символа слова в исходной строке или сообщение о том, что заданного слова нет в строке

9.

Определить, является ли вводимая строка целым числом, т. е. содержит только цифры и, возможно, знак "+" или "-", и определить тип числа (если вводимое число больше 32767 или меньше -32768, то тип числа long, иначе int).

исходная строка

число и его тип: "int" или "long" или сообщение о том, что введенная строка не является целым числом

10.

Определить, является ли вводимая строка вещественным числом с целой и дробной частью и, возможно, знаком "+" или "-", и определить тип числа (если вводимое число содержит больше 7 значащих цифр, то тип числа double, иначе float).

исходная строка

число и его тип: "double" или "float" или сообщение о том, что введенная строка не является вещественным числом

11.

Проанализировать правильность задания слов в строке. Слова в строке могут состоять только из букв (прописных или строчных) и цифр. Разделителями между словами служат пробелы и/или запятые.

исходная строка

слова исходной строки и сообщение о том, является ли данное слово правильным или нет

12.

Определить количество повторений заданной строки в исходной строке (без различия строчных и прописных букв).

исходная строка, строка поиска

количество повторений строки поиска в исходной строке

13.

Определить количество предложений в исходной строке (разделителем между предложениями являются символы ".", "?", "!").

исходная строка

количество предложений в исходной строке

14.

Проанализировать типы слов в исходной строке (если слово содержит только цифры и, возможно, знак "+" или "-" впереди и десятичную точку, то оно считается типа "number", иначе "string"). Разделителями между словами служат пробелы и/или запятые.

исходная строка

слова строки и их типы - "number" или "string"

15.

Убрать заданное слово из исходной строки (без различия строчных и прописных букв). В строке может быть несколько одинаковых слов.

исходная строка, слово, которое надо

убрать

измененная строка

16.

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

исходная строка, два слова

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

17.

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

исходная строка

неправильные слова или сообщение о том, что текст не содержит ошибок

18.

Убрать лишние пробелы между словами исходной строки (между словами должен быть оставлен только один разделитель).

исходная строка

измененная строка

19.

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

исходная строка, заданное слово

номера позиций первого символа слова или сообщение о том, что данного слова нет в исходной строке

20.

Заменить заданное слово в исходной строке на указанное слово (без различия строчных и прописных букв). В строке может быть несколько одинаковых слов.

исходная строка, слово поиска, слово замены

измененная строка и сообщение о том, производилась замена или нет

21.

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

исходная строка, строка поиска, строка замены

измененная строка и сообщение о том, производилась замена или нет

22.

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

исходная строка,

строка, которую надо убрать

измененная строка и сообщение о том, производилась замена или нет

23.

Заменить первую букву предложения на прописную, если она строчная. Строка может содержать как русские и украинские, так и латинские буквы. Разделителем между предложениями считаются символы ".", "?", "!".

исходная строка

измененная строка и сообщение о том, производилась замена или нет

24.

Заменить все прописные буквы внутри слов исходной строки (за исключением первой буквы) на строчные.

исходная строка

измененная строка и сообщение о том, производилась замена или нет

25.

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

исходная строка

строка, содержащая слова исходной строки в алфавитном порядке и строка нераспознанных слов

26.

Форматировать слова исходной строки влево по заданной длине выводимой строки (если слово не помещается полностью на данной строке, оно переносится на первую позицию следующей строки).

исходная строка, макси-мальный размер выводимой строки

отформатированные строки

27.

Вывести строку заголовка с разрядкой. Разделителем между словами заголовка считаются пробелы. Текст в исходной строке должен быть переведен в заглавные буквы и между буквами слов должно быть введено nspace пробелов, а между словами - 2*nspace+1 пробелов. Слова в заголовке могут содержать как русские и украинские, так и латинские буквы.

строка заголовка, значение n.

заголовок с разрядкой

28.

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

исходная строка

строка, содержащая правильные идентификаторы и строка, содержащая ошибочные идентификаторы

29.

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

исходная строка, буква

количество слов в исходной строке, начинающихся на заданную букву

30.

Определить количество символов в словах исходной строки (без учета символов-разделителей).

исходная строка

количество символов в словах исходной строки

31.

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

строка исходных слов, строка слов перевода, исходное слово

перевод слова или сообщение о том, что данного слова нет в исходной строке

32.

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

исходная строка (должна содержать только буквы латинского алфавита)

результирующая строка

33.

Вывести строку, являющуюся пересечением двух строк (в пересечении содержатся только те символы, которые есть в обеих строках)

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

строка пересечения

34.

Определить количество повторений заданных символов в исходной строке

исходная строка, строка символ

Количество повторений для каждого символа строки

35.

Вывести для каждой из введенных двух строк строку, в которой содержатся только те символы, которые есть только в данной строке

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

две результирующие строки

2.   Введите программу с клавиатуры в среде BorlandC++.

3.   Выполните отладку программы и запустите ее на выполнение. Протестируйте программу для ошибочных и правильных значений исходных данных.

4.   Покажите преподавателю программу и результаты ее работы (при ошибочных и правильных значениях исходных данных) и скопируйте текст программы и результаты работы программы в окно текстового редактора Блокнот с заголовками "Текст программы имя-программы" и "Результат работы программы имя-программы".

5.   Скопируйте полученный в окне текстового редактора Блокнот документ на свою дискету или флэш-карту.

5. Содержание отчета

В отчете должно быть представлено содержимое созданного вами документа.

6. Вопросы для самоконтроля

1.   Как выполняют ввод-вывод символов функции getchar() и putchar()?

2.   Как определяется строка для ввода в языке C?

3.   Какие функции используются в C для ввода и вывода строк и как они работают?

4.   Какие группы функций для операций над символами и строками символов имеются в стандартной библиотеке C?

5.   Какие тесты для символов можно выполнить с помощью функций C?

6.   Какие функции C осуществляют преобразование чисел в строки и обратные преобразования?

7.   Какие операции над строками символов можно выполнить в C?

8.   Как функция strtok() выполняет анализ слов в строке?