18537

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

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

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

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

Русский

2013-07-08

223.01 KB

20 чел.

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


 

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

70774. Исследование зеркальной антенны (ЗА) 207.5 KB
  Экспериментально выяснить влияние смещения облучателя ЗА из фокуса параболоидного зеркала антенны на ширину и направление главного лепестка характеристики направленности антенны.
70775. Определение коэффициента вязкости жидкости методом Стокса 170.5 KB
  Цель работы: Изучить явление переноса на примере внутреннего трения; определить динамический и кинематический коэффициент вязкости жидкости. Для явления внутреннего трения справедлив закон Ньютона: градиент скорости динамический коэффициент вязкости...
70776. Изучение основных схем включения операционных усилителей 125.5 KB
  ОУ выполняются в виде интегральной полупроводниковой микросхемы которая содержит несколько транзисторных каскадов усиления напряжения причем входной каскад всегда выполняется по дифференциальной параллельно-симметричной схеме выходной каскад усиления тока и цепи...
70777. Исследование входных и выходных характеристик транзисторов 104.5 KB
  Для данного транзистора используя справочные данные определить тип цоколевку и выписать эксплуатационные параметры. Составить принципиальную схему для исследования входных и выходных характеристик транзистора в схеме с общим эмиттером с учетом его структуры.
70778. Исследование диаграмм срыва и нагрузочных характеристик автогенератора 157.5 KB
  В начале данной лабораторной работы были сняты зависимости амплитуды переменного напряжения на управляющем электроде затворе полевого транзистора от напряжения смещения при двух коэффициентов включения К1=15 и К2=05.
70779. ЛИНЕЙНЫЕ ЭЛЕКТРИЧЕСКИЕ ЦЕПИ 912 KB
  В него включены лабораторные работы по следующим разделам курса ТОЭ: переходные процессы в электрических цепях нелинейные электрические цепи теория электромагнитного поля. Сборку электрической цепи рекомендуется производить в следующей последовательности...