18537

Символьные строки и функции обработки строк

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа № 7 Символьные строки и функции обработки строк Строка символов это последовательность символов произвольной длины завершающаяся нульсимволом все биты в байте нулевые. Строковые константы записываются в кавычках например: Как Ва...

Русский

2013-07-08

223.01 KB

24 чел.

\Лабораторная работа № 7

Символьные строки и функции обработки строк

Строка символов - это последовательность символов произвольной длины, завершающаяся нуль-символом '\0' (все биты в байте нулевые).

Строковые константы записываются в кавычках, например:

"Как Вас зовут?"

Если в программе встречается строковая константа, компилятор выделяет для нее память объемом, равным длине строки (количеству символов) + 1 (для нуль-символа). Признак конца строки '\0' добавляется автоматически.

Строковые переменные описываются либо как массивы символов, либо как указатели на символы, например:

char stroka[81]; /* строка длиной до 80 символов */

char *str; /* указатель на строку */

В первом случае память для строки выделяется (имя массива является адресом его первого символа), во втором случае – нет (выделяется только для указателя).

При выполнении оператора

str= "Группа 4101";

указателю str присваивается адрес памяти, где размещена строковая константа "Группа 4101". Для массива такой оператор будет неверным, т.к. адрес массива - величина постоянная.

Еще раз обратите внимание, что в Си имя массива отождествляется с адресом его первого элемента. Для описанного выше массива stroka имя массива stroka и &stroka[0] идентичны. Другими словами, имя массива является указателем на первый символ, причем его нельзя изменять.

Если строка будет вводиться с клавиатуры, то лучше описать переменную как массив символов, иначе предварительно придется выделять память для строки, например, с помощью функции malloc().

Функции gets() и puts()

Для ввода и вывода строк символов служат функции gets() и puts().

Функция gets() вводит с клавиатуры строку, заменяя символ "перевод строки" на нуль-символ, и помещает ее по указанному адресу. Например:

gets (stroka); /* ввод строки в массив строка */

Функция puts() выводит указанную строку на экран. Например, оператор

puts(str);

выведет на экран строку, на которую указывает переменная str, курсор после вывода переместится на новую строку.

Функции обработки строк

Для работы со строками символов в библиотеке Turbo C имеется ряд функций, например, функция определения длины строки strlen(), копирования строк strcpy(), сцепления строк strcat(), сравнения строк strcmp(), нахождения в строке указанного символа strchr(). Прототипы таких функций находятся в файле string.h, их перечень приведен в следующем разделе.

Примеры обращения к функциям обработки строк:

char s1[81], s2[81], s3[81];

char *s;

gets(s1);

printf ("Длина строки = %d\n", strlen(s1));

strcpy(s2,s1); /* копирование строки s1 в массив s2 */

if ((s=strchr(s2,'a'))!=NULL) /* есть буква 'a' в строке s2 */

*s = 'b'; /* замена в строке s2 первой буквы 'a' на 'b' */

gets(s3);

if (strcmp(s1,s3)==0) printf ("Строки одинаковые\n");

Рассмотрим одну из библиотечных функций – функцию сцепления двух заданных строк strcat(). Определение функции:

char *strcat (char *s1, char *s2);

Функция копирует строку s2 (на которую ссылается указатель s2) в конец строки s1 и возвращает значение s1 - ссылку на сцепленную строку. Например, если s1="2007 ", s2="год", то после сцепления строк s1="2007 год".

Работу функции можно описать так:

char *strcat (char *s1, char *s2)

{char *rs; /* ссылка на результирующую строку*/

rs=s1; /* запоминание адреса начала строки s1 */

while (*s1!='\0')

s1++; /* поиск конца строки s1 */

/* копирование строки s2 в конец s1 */

while (*s2!='\0')

{*s1=*s2; s1++; s2++; }

*s1='\0';

return rs;

}

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

А теперь посмотрите на более компактную (но менее понятную) запись этой функции:

char *strcat (char *s1, char *s2)

{char *rs;

rs=s1; /* запоминание адреса начала строки s1 */

while (*s1!='\0') s1++; /* поиск конца строки s1 */

while ((*s1++ = *s2++) !='\0'); /* копирование s2 в конец s1, включая

нуль-символ */

return rs;

}

Даже еще можно сократить текст функции, записав второй оператор while короче:

while (*s1++ = *s2++);

Непонятно? Каждый раз очередной символ из второй строки копируется в первую, затем значения указателей s1 и s2 увеличиваются на 1, т.e. происходит продвижение указателей к следующим символам строк. Этот процесс повторяется до тех пор, пока не скопируется нуль-символ (т.к. выход из цикла происходит при нулевом значении выражения в скобках).

Пример драйвера для функции сцепления строк strcat():

#include <stdio.h>

/*************************/

/*Тестирование ф-ции strcat*/

/*************************/

main()

{char str1[81],str2[81];

puts ("Введите две строки");

gets (str1);

gets (str2);

if (strlen(str1)+strlen(str2) < 81)

{puts ("Результат:");

puts (strcat(str1,str2));

printf ("Строки после вызова функции сцепления:\n%s\n%s\n", str1,str2);

}

else puts ("Не хватает памяти для результирующей строки");

getch();

}

Примечание. Так как в этой программе вызывается библиотечная функция определения длины строки strlen(), при работе в среде Borland C++ нужно включить в программу директиву #include <string.h> и изменить имя функции srrcat(), чтобы оно не совпадало с библиотечным.

Библиотечные функции обработки строк

1. strlen - определить длину строки (число символов без завершающего нуль-символа).

Объявление функции: int strlen(char *s);

Пример ее вызова:

char s[81];

gets(s);

printf ("Длина строки = %d\n", strlen(s));

2. strcmp - сравнить две строки.

Объявление: int strcmp (char *s1, char *s2);

0, если строки одинаковые;

Значение функции = разность кодов двух первых несовпадающих

символов, если строки разные.

Например, если s1="abcde", s2= "abca12", функция вернет число 3 (‘d’–‘a=100 - 97).

3. strncmp - сравнить первые n символов двух строк.

Объявление: int strncmp (char *s1, char *s2, int n);

0, если первые n символов строк совпадают;

Значение функции = разность кодов двух первых несовпавших 

символов в противном случае.

Например, если s1="123456", s2= "12789", n=4, функция вернет число -4 (‘’–‘’=51 -55). Если же n=2, то результатом будет 0.

4. strcpy - копировать строку s2 в s1.

Объявление: char *strcpy (char *s1, char *s2);

Значением функции является s1 - ссылка на первую строку.

Пример ее вызова:

char a[20], b[20];

strcpy (a,Группа 4251”);

strcpy (b, a); /* копирование строки из массива a в b */

5. strncpy - копировать не более n символов строки s2 в s1.

Объявление: char *strncpy (char *s1, char *s2, int n);

Значением функции является s1 ссылка на первую строку.

Например, если s1="1234567", s2= "abcde", n=4, функция вернет адрес строки s1="abcd567". Если задать n > длины строки s2, то в s1 скопируется вся строка s2 (включая нуль-символ) и строки получатся одинаковыми. Так при n=8, s2="abcde", результатом будет s1="abcde".

6. strcat - сцепить две строки s1 и s2 ( копировать вторую строку в конец первой).

Объявление: char *strcat (char *s1, char *s2);

Значением функции является s1 - ссылка на результирующую строку.

Например, если s1="abc", s2="defgh", то после сцепления строк s1="abcdefgh".

7. strncat - сцепить две строки s1 и s2, причем из второй строки копировать не более n символов.

Объявление: char *strncat (char *s1, char *s2, int n);

Значением функции является s1 ссылка на результирующую строку ( n символов строки s2 копируется в конец строки s1. Если n > длины s2, то копируется вся строка).

Например, если s1="abc", s2="12345", n=3, то после сцепления строк s1="abc123".

8. strchr - найти в строке s первое вхождение символа c.

Объявление: char *strchr (char *s, char c);

Значение функции - ссылка на первый символ c в строке s или NULL (пустая ссылка), если символа нет в строке.

Пример вызова функции:

char str[81], *p;

gets (str);

p = strchr(str,a’);

if (p == NULL) puts (“В строке нет буквыa’”);

else *p= ‘b’; /* замена в строке 1-й буквы a на b */

9. strrchr - найти в строке s последнее вхождение символа c.

Объявление: char *strrchr (char *s, char c);

Значение функции - ссылка на последний символ c в строке s или NULL (пустая ссылка), если символа нет в строке.

Пример вызова функции:

/* удаление всех пробелов в строке */ 

char str[81], *p;

. . .

while((p=strrchr(str, ’))!=NULL)

strcpy (p, p+1);

10. strpbrk - найти в строке s1 любой из множества символов, входящих в строку s2.

Объявление: char *strpbrk (char *s1, char *s2);

Значение функции - ссылка на любой символ в строке s1, имеющийся в s2, или NULL (пустая ссылка), если символов из s2 нет в s1.

Пример вызова функции:

char str1[81], str2[81], *p;

. . .

p = strpbrk(str1, str2);

Например, если str1=”a1d2, str2=”4321, то указателю p будет присвоен адрес символа ‘1 в строке str1 (функция просматривает поочередно символы первой строки и ищет их во второй строке, пока не найдет или не кончится 1-я строка).

11. strstr - найти в строке s1 первое вхождение строки s2. 

Объявление: char *strstr (char *s1, char *s2);

Значение функции - ссылка на первое вхождение s2 в s1 или NULL (пустая ссылка), если подстроки s2 нет в s1.

Например, если s1="ab1111234cd1123", s2= "1123", функция вернет адрес третьего символа ‘1 в строке s1, с которого начинается подстрока "1123". 

Пример вызова функции:

char text []= "Группа 4172", *p;

if ((p = strstr(text, "4172" ))!=NULL)

strcpy(p, "4272"); /* В результате text = "Группа 4272" */

Дополнительные функции обработки строк

12. strrsub - найти в строке s1 последнее вхождение строки s2.

Определение: char *strrsub (char *s1,char *s2);

Значение функции - ссылка на последнее вхождение s2 в s1 или NULL (пустая ссылка), если подстроки s2 нет в s1.

13. delchr - удалить в строке s первое вхождение символа c.

Определение: char *delchr (char *s,char c);

Значением функции является s - ссылка на строку.

14. delrchr - удалить в строке s последнее вхождение символа c.

Определение: char *delrchr (char *s,char c);

Значением функции является s - ссылка на строку.

15. delnchr - удалить в строке s n первых символов.

Определение: char *delnchr (char *s,int n);

Значением функции является s - ссылка на строку.

16. delchrn - удалить в строке s все символы, кроме n первых .

Определение: char *delchrn (char *s,int n);

Значением функции является s - ссылка на строку.

17. delstr - удалить в строке s1 первое вхождение строки s2.

Определение: char *delstr (char *s1,char *s2); 

Значением функции является s1 - ссылка на первую строку.

18. chngchar - заменить в строке s каждый символ c1 на символ c2.

Определение: char *chngchar (char *s,char c1,char c2);

Значением функции является s - ссылка на строку.

19. chngstr - заменить в строке s первое вхождение строки s1 на строку s2.

Определение: char *chngstr (char *s,char *s1,char *s2);

Значением функции является s - ссылка на строку.

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

1. Ознакомьтесь с теоретическим материалом и примером решения задачи (описанием функции strcat() и драйвером этой функции). Ответьте на контрольные вопросы.

. Получите задание у преподавателя.

3. Составьте функцию и драйвер, подберите тесты для проверки функции на копьютере.

4. Если аналогичная функция есть в библиотеке Turbo C или Borland C++, выполните тестирование библиотечной функции с помощью вашего драйвера, добавив директиву #include <string.h> (разумеется, свою функцию пока включать в программу не нужно). Затем выполните тестирование и отладку своей функции (результаты должны быть такими же, как и при выполнении библиотечной функции).

5. Оформите и сдайте отчет по лабораторной работе.


 

А также другие работы, которые могут Вас заинтересовать

42021. Обработка строк и символов 47 KB
  Варианты заданий С помощью текстового редактора создать файл содержащий текст длина которого не превышает 1000 символов длина строки текста не должна превышать 70 символов. С помощью текстового редактора создать файл содержащий текст длина которого не превышает 1000 символов длина строки текста не должна превышать 70 символов. С помощью текстового редактора создать файл содержащий текст длина которого не превышает 1000 символов длина строки текста не должна превышать 70 символов.
42022. Использование классов на примере работы с простыми геометрическими фигурами 40.5 KB
  Варианты заданий Треугольник задаваемый координатами вершин. Прямоугольник задаваемый координатами своих левойверхней и правойнижней вершин стороны параллельны осям. Треугольник задаваемый координатами вершин. Прямоугольник задаваемый длинами своих диагоналей и координатами центра стороны параллельны осям.
42024. Наследование классов. Разработка простейшего производного класса 28.5 KB
  Цель работы: Разработка простейшего производного класса. В функции min организовать ввод конкретных параметров объекта с клавиатуры создание объекта экземпляра класса тестирование всех его методов как старых так и новых в текстовом режиме с выдачей соответствующих сообщений. Организовать исходный текст в виде пяти исходных файлов: заголовочный с описанием класса .h из предыдущей части задания; с реализацией методов функцийчленов класса .
42026. Перегрузка операций и функций 58 KB
  Для всех заданий реализовать: а конструктор инициализирующий значения полей некоторыми значениями; б вывод данных на экран оператор . Необходимо корректное описание данного оператора в демонстрация всех операций должны быть реализована через пользовательское меню где пользователь выбирает действие вводит данные указывает тип данных если нужно и т. Реализовать: а сложение вычитание векторов операторы –; б умножение вектора на скаляр оператор ; в скалярное произведение векторов оператор ; г векторное произведение...
42028. Динамические структуры данных (списки, очереди, стеки, двоичные деревья) 56.5 KB
  Программа должна обеспечивать: начальное формирование данных о всех автобусах в парке в виде двусвязного циклического списка; при выезде каждого автобуса из парка вводится номер автобуса и программа удаляет данные об этом автобусе из списка автобусов находящихся в парке и записывает эти данные в список автобусов находящихся на маршруте; при въезде каждого автобуса в парк вводится номер автобуса и программа удаляет данные об этом автобусе из списка автобусов находящихся на маршруте и записывает эти данные в список автобусов...
42029. Структура окна Maple. Арифметические операции, числа, константы и стандартные функции. Элементарные преобразования математических выражений. Функции в Maple. Операции оценивания. Решение уравнений и систем 317 KB
  Структура окна Mple. Функции в Mple. Структура окна Mple Mple  это пакет для аналитических вычислений на компьютере содержащий более двух тысяч команд которые позволяют решать задачи алгебры геометрии математического анализа дифференциальных уравнений статистики математической физики. Для того чтобы запустить Mple необходимо в Главном меню Windows выбрать в группе Программы название данного приложения: Mple.