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


 

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

83337. Фонетико-фонематическое недоразвитие речи 17.03 KB
  Фонематический слух являясь частью физиологического слуха направлен на соотнесение и сопоставление слышимых звуков с их эталонами которые хранятся в памяти человека упорядочение в решетке фонем. Каждый человек имеет индивидуальные особенности произношения звуков: один говорит тихо другой громко...
83338. Макросередовище маркетингу 25.99 KB
  Виділяють принаймні шість факторів які в певний спосіб позитивно або негативно можуть впливати на управління системою маркетингу: демографічні економічні природні науково-технічні політичні фактори та фактори культурного оточення.
83339. Порядок захисту права на комерційну таємницю 63.5 KB
  Комерційною таємницею можуть бути відомості технічного організаційного комерційного виробничого та іншого характеру за винятком тих які відповідно до закону не можуть бути внесені до комерційної таємниці. Важливим для забезпечення комерційної таємниці є забезпечення дії нормативно-правових актів...
83340. Secretary’s work 19.74 KB
  Professional receptionist (квалифицированный секретарь) is an irreplaceable assistant (помощник руководителя) to the head and face of the company. Secretary’s job is a good school of life and a great launching pad (стартовая площадка) to start a career.
83341. Підсумковий урок з теми «Числівник» 59.5 KB
  Мета: Систематизувати та узагальнити знання про числівник як частину мови, вправляти учнів в доцільному та правильному вживанні числівників у мовленні; розвивати вміння аналізувати, порівнювати, зіставляти, узагальнювати, роботи висновки; розвивати мовлення, логічне мислення...
83342. Закріплення вивченого про числівник, його роль у мовленні. Вживання числівників у загадках 39.5 KB
  Закріпити знання учнів з теми Числівник; з’ясувати роль числівників у мовленні; вживання числівників у загадках. Як називається це речення прислів’я Поясніть як ви його розумієте Чи є числівники в нашому девізі Назвіть їх.
83343. Вживання прикметників для всебічної характеристики предметів 57.5 KB
  Закріплювати знання учнів про відмінювання прикметників, удосконалювати вміння визначати рід, число, відмінок прикметників у реченнях, добирати синоніми та антоніми до них. Розвивати вміння вживати прикметники в мовленні ля повнішого розкриття думки, характеристики предметів...
83344. Відмінювання іменників. Орудний відмінок іменників жіночого роду 552.5 KB
  Формувати вміння вживати в усному і писемному мовленні іменників жіночого роду з нульовим закінченням в Орудному відмінку; розвивати зв’язне мовлення, увагу, пізнавальну самостійність; виховувати ретельне ставлення до вивчення української мови, любов до рідного краю, бережливе ставлення до свого здоров’я.
83345. Підсумковий урок по темі «Речення» 38.5 KB
  Що таке речення Які бувають речення за метою висловлювання Які бувають речення за емоційним забарвленням Що таке граматична основа речення На що вказує підмет На які питання відповідає Що виражає присудок На які питання відповідає Які ще члени речення ви знаєте На які питання...