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. Оформите и сдайте отчет по лабораторной работе.


 

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

5339. Повышение эффективности работы подвижного состава и качества транспортного обслуживание в логистической системе 434 KB
  Цель курсового проекта – повышение эффективности работы подвижного состава и качества транспортного обслуживания в логистической системе. Поставленная цель предполагает решение следующих задач: проектирование доставки грузов в лог...
5340. Исследование перемещений консоли при косом изгибе 553 KB
  Исследование перемещений консоли при косом изгибе Цель работы:Проверка достоверности формул, определяющих прогиб при косом изгибе опытное установление величины перемещений балки и сравнение с теоретическими значениями. Методика испытаний, при...
5341. Прогнозирование производства продукции скотоводства в племзаводе по разведению черно-пестрого скота с поголовьем коров 1000 голов, удоем 7000 кг молока в год на одну корову 216.5 KB
  Скотоводство является превалирующей отраслью животноводства. Традиционно в России разведением племенного скота занимались наиболее зажиточные крестьяне, помещики, также высокая культура скотоводства всегда поддерживалась в монастырских хозя...
5342. Разработка комплексного проекта свиноводческой фермы с годовой производительностью 25 000 ц свинины в живой массе 278.5 KB
  Введение. Свиноводство имеет большое народно-хозяйственное значение. На долю его приходится свыше 20% валовой продукции животноводства и 10% всей продукции сельского хозяйства. Высокая плодовитость свиней, короткий эмбриональный период, скороспелост...
5343. Комплексная оценка метеорологической обстановки по заданной воздушной трассе 76 KB
  Оценка характера синоптической обстановки. В районе ИПМ (Берлин) находится неустойчивая холодная воздушная масса. Берлин находится в тыловой части циклона, в центре которого давление 990. Далее маршрут проходит через холодный фронт, далее тёплый...
5344. Микропроцессорное устройство Измерения частоты вращения ротора двигателя 99 KB
  Объектом проектирования является измеритель частоты вращения ротора двигателя. Цель работы – создание микропроцессорного комплекса измерения частоты вращения ротора двигателя . В результате проектирования разработана принципиальная...
5345. Работа со списками в MS EXCEL 206.5 KB
  Работа со списками в MS EXCEL Цель: Приобрести навыки поиска и агрегирования данных в списке. Краткая теория Компьютерные информационные технологии широко используются для анализа данных и подготовку управленческих решений на основе экономико ...
5346. Финансовый анализ. Технология подбора параметра 196.5 KB
  Финансовый анализ. Технология подбора параметра Цель работы: приобрести навыки решения задач финансового менеджмента с использованием встроенных функций MS Excel. Краткая теория ФИНАНСОВЫЕ ФУНКЦИИ В MS Excel встроен ряд функций, позволяющий...
5347. Работа с базами данных в MS EXCEL 55.5 KB
  Работа с базами данных в MSEXCEL Цель: Приобрести навыки использования встроенных функций МS Ехсеl для работы со списками. Краткая теория Информационная технология обработки данных в информационных системах предполагает их хранение и обработку...