Лаб.раб. Министерство образования и науки российской федерации пензенский государственный
Скачать 0.8 Mb.
|
Лабораторнаяработа№6Тема:"Строки" Цель работы: изучение правил описания, ввода-вывода и основных функций обработки символьных данных. Краткие теоретические сведения. Строки в С++ позволяют работать с символьными данными. С помощью строк возможно осуществить чтение с клавиатуры текста, его обработка и вывод. В С++ существует 2 типа строк: Массив переменных типа char, заканчивающийся нуль-терминатором \0. Символьные строки состоят из набора символьных констант заключённых в двойные кавычки. При объявлении строкового массива необходимо учитывать наличие в конце строки нуль-терминатора, и отводить дополнительный байт под него. char string[10]; // string – имя строковой переменной, 10 – размер массива, (в строке может поместиться 9 символов, последнее место отводится под нуль-терминатор) Специальный класс string Для его работы необходимо в начале программы подключить заголовочный файл string: #include Для создания строки необходимо в начале программы написать usingnamespacestd; Теперь чтоб создать строку достаточно написать: strings; Для записи в строку можно использовать оператор = s="Hello"; Доступ к i-му элементу строки s типа string осуществляется стандартным образом s[i]. Над строками типа string определены следующие операции: присваивания, например s1=s2; объединения строк (s1+=s2 или s1=s1+s2) — добавляет к строке s1 строку s2, результат храниться в строке s1, пример объединения строк: сравнения строк: s1=s2, s1!=s2, s1 Существует множество функций для работы со строками (таблица 7). Таблица 7 – Функции для работы со строками
Функции для работы со строками, прототипы которых описаны в заголовочном файле string.h: Сравнение строк. Для сравнения строк используются функции strcmp и strncmp. Функция int strcmp ( const char *str1, const char *str2); лексикографически сравнивает строки str1, str2 и возвращает –1, 0 или 1, если строка str1 соответственно меньше, равна или больше строки str2. Функция int strncmp ( const char *str1, const char *str2, size_t n); лексикографически сравнивает не более чем n первых символов из строк str1 и str2. Функция возвращает –1, 0 или 1, если первые n символов из строки str1 соответственно меньше, равны или больше первых n символов из строки str2. Пример: // пример сравнения строк #include #include int main() { char str1[] = "aa bb"; char str2[] = "aa aa"; char str3[] = "aa bb cc"; printf("%d\n", strcmp(str1, str3)); // печатает: -1 printf("%d\n", strcmp(str1, str1)); // печатает: -0 printf("%d\n", strcmp(str1, str2)); // печатает: 1 printf("%d\n", strncmp(str1, str3, 5)); // печатает: 0 return 1; } Копирование строк. Для копирования строк используются функции strcpy и strncpy. Функция char *strcpy ( char *str1, const char *str2 ); копирует строку str2 в строку str1. Строка str2 копируется полностью, включая завершающий нулевой байт. Функция возвращает указатель на str1. Если строки перекрываются, то результат непредсказуем. Функция char *strncpy ( char *str1, const char *str2, size_t n ); копирует n символов из строки str2 в строку str1. Если строка str2 содержит меньше чем n символов, то последний нулевой байт копируется столько раз, сколько нужно для расширения строки str2 до n символов. Функция возвращает указатель на строку str1. Пример: char str1[80]; char str2 = "Copy string."; strcpy ( str1, str2 ); printf ( str1 ); // печатает: Copy string. Соединение строк. Для соединения строк в одну строку используются функции strcat и strncat. Функция char* strcat ( char *str1, const char *str2 ); присоединяет строку str2 к строке str1, причем завершающий нулевой байт строки str1 стирается. Функция возвращает указатель на строку str1. Функция char* strncat ( char *str1, const char *str2, size_t n ); присоединяет n символов из строки str2 к строке str1, причем завершающий нулевой байт строки str1 стирается. Функция возвращает указатель на строку str1. если длина строки str2 меньше n, то присоединяются только символы, входящие в строку str2. После соединения строк к строке str1 всегда добавляется нулевой байт. Функция возвращает указатель на строку str1. Пример: #include #include { char str1[80] = "String "; char str2 = "catenation "; char str3 = "Yes No"; strcat ( str1, str2 ); printf ("%s\n", str1 ); // печатает: String catenation strncat ( str1, str3, 3 ); printf ("%s\n", str1 ); // печатает: String catenation Yes return 1; } Поиск символа в строке. Для поиска символа в строке используются функции strchr, strrchr, strspn, strcspn и strpbrk. Функция char* strchr ( const char *str, int c ); ищет первое вхождение символа, заданного параметром c, в строку str. В случае успеха функция возвращает указатель на первый найденный символ, а в случае неудачи – NULL. Функция char* strrchr ( const char *str, int c ); ищет последнее вхождение символа, заданного параметром c, в строку str. В случае успеха функция возвращает указатель на последний найденный символ, а в случае неудачи – NULL. Пример: #include { char str[80] = "Char search"; printf ("%s\n", strchr ( str, 'r' )); // печатает: r search printf ("%s\n", strrchr ( str, 'r' )); // печатает: rch return 1; } Функция size_t strspn ( const char *str1, const char *str2 ); возвращает индекс первого символа из строки str1, который не входит в строку str2. Функция size_t strcspn ( const char *str1, const char *str2 ); возвращает индекс первого символа из строки str1, который входит в строку str2. Пример: int main ( ) { char str[80] = "123 abc"; printf ("n = %d\n", strspn ( str, "321" ); // печатает: n = 3 printf ("n = %d\n", strcspn ( str, "cba" ); // печатает: n = 4 return 1; } Функция char* strpbrk ( const char *str1, const char *str2 ); находит первый символ в строке str1, который равен одному из символов в строке str2. В случае успеха функция возвращает указатель на этот символ, а в случае неудачи – NULL. Пример. char str[80] = "123 abc"; printf ("%s\n", strpbrk ( str, "bca" )); // печатает: abc Сравнение строк. Для сравнения строк используются функция strstr. Функция char* strstr ( const char *str1, const char *str2 ); находит первое вхождение строки str2 (без конечного нулевого байта) в строку str1. В случае успеха функция возвращает указатель на найденную подстроку, а в случае неудачи – NULL. Если указатель str1 указывает на строку нулевой длины, то функция возвращает указатель str1. Пример: char str[80] = "123 abc 456; printf ("%s\n", strstr ( str, "abc"); // печать: abc 456 Разбор строки на лексемы. Для разбора строки на лексемы используется функция strtok. Функция char* strtok ( char *str1, const char *str2 ); возвращает указатель на следующую лексему (слово) в строке str1, в которой разделителями лексем являются символы из строки str2. В случае если лексемы закончились, то функция возвращает NULL. При первом вызове функции strtok параметр str1 должен указывать на строку, которая разбирается на лексемы, а при последующих вызовах этот параметр должен быть установлен в NULL. После нахождения лексемы функция strtok записывает после этой лексемы на место разделителя нулевой байт. Пример. #include { char str[ ] = "12 34 ab cd"; char *p; p = strtok ( str, " " ); while (p) { printf ( "%s\n", p ); // печатает в столбик значения: 12 34 ab cd p = strtok ( NULL, " " ); } return 1; } Определение длины строки. Для определения длины строки используется функция strlen. Функция size_t strlen ( const char *str); возвращает длину строки, не учитывая последний нулевой байт. Например, char str[] = "123"; printf ("len = %d\n", strlen ( str )); // печатает: len = 3 Пример выполнения задания. Задание. Найти слова во введенной с клавиатуры строке, вывести их на экран и подсчитать их количество. Схема программы представлена на рисунке 24: да
Рисунок 24 Пример программы: #include vid main() { char s[100],d[100]; int i=0,j=0,bw,ew,len; gets(s); len=strlen(s); while (i { while((s[i]==' ')&&(i while((s[i]!=' ')&&(i strncpy(d,&s[bw],ew-bw+1); d[ew-bw+1]=0; if (bw { j++; printf("%s\n",d);} } printf("Vsego slov %d\n", j); } Контрольные вопросы Строки в языке С++: понятие строки, описание строк в программе, обращение к элементам строки. Три способа ввода строк в С++. Три способа вывода строк в С++. Способы инициализации строк (задание значений в программе). Стандартные функции для обработки строк. Варианты заданий Дана последовательность символов S1, …, SN. Группы символов, разделенные пробелом (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Определить число символов в самом длинном слове строки. Слова отделяются знаком “/”. В произвольном тексте выделить и отпечатать слова, начинающиеся с буквы А. В произвольном тексте вставить между первым и вторым словом новое слово. В произвольном тексте найти и отпечатать слова, содержащие букву Е. Отпечатать второе и третье слова произвольного текста. В произвольном тексте вставить между вторым и третьим словом новое слово. В произвольном тексте найти и отпечатать все слова длиной 5 символов. В произвольном тексте найти самое короткое слово. В последовательности из 10 пятибуквенных слов найти и поменять местами пару слов, у которых первые три буквы одного совпадают с последними тремя буквами другого. Упорядочить в алфавитном порядке последовательность из 10 пятибуквенных слов. В строке из 50 символов отдельные слова разделены пробелом. Упорядочить строку так, чтобы каждое следующее слово было не короче предыдущего. Расположить слова строки в порядке, обратным исходному. Подсчитать количество букв ‘a’ в последнем слове строки. Найти количество слов, у которых первый и последний символы совпадают между собой. Исключить из строки слова, расположенные между скобками ( , ). Сами скобки должны быть исключены. В произвольном тексте найти и отпечатать слова, содержащие букву А. Отпечатать первое и второе слова произвольного текста. В произвольном тексте вставить после первого слова новое слово. В произвольном тексте найти и отпечатать все слова длиной 4 символа. В произвольном тексте найти самое длинное слово. Выполнить сравнение двух строк s и d. Результат вывести в виде сообщения «идентичны» или «не идентичны». Добавить в конец строки новое слово, длинною 5 симвлов, иначе выдать сообщение об ошибке. Добавить в начало строки новое слово, начинающееся с буквы а, иначе, если слово начинается с другой буквы вывести сообщение о невозможности добавления. Посчитать какое количество раз встречается буква n (задается при каждом выполнении алгоритма). Проанализировать массив символов, состоящий из n символов. Если массив состоит из n-5 символов, добавить в конец набор символов rrrrr. |