18537

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

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

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

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

Русский

2013-07-08

223.01 KB

25 чел.

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


 

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

21866. Анализ внешней среды и ее влияние на реализацию альтернатив 71 KB
  С этого периода связь фирмы с внешней средой стала рассматриваться как одна из главнейших ее характеристик. Внешняя среда фирмы предприятия или организации – это совокупность активных субъектов и сил действующих за их пределами не поддающихся контролю со стороны фирмы предприятия или организации и влияющих на возможности фирмы предприятия или организации устанавливать и поддерживать отношения с субъектами внешнего окружения для достижения своих стратегических целей. Внешняя среда фирмы достаточно разнородна.2 Среда прямого воздействия К...
21867. Условия неопределенности и риска 55.5 KB
  Условия неопределенности и риска.3 – Виды и условия предпринимательского риска; 8. По критерию определенности информации различают решения принятые в условиях: а определенности б вероятностной определенности риска в неопределенности ненадежности. В отечественной экономике на данном этапе ее развития риск особенно вероятен вследствие неуменьшающейся неопределенности политической ситуации неустойчивости экономической среды отсутствия гарантии получения ожидаемого результата Природа риска в рыночной экономике...
21868. Приемы разработки и выборов управленческих решений в условиях неопределенности и риска 56.5 KB
  Приемы разработки и выборов управленческих решений в условиях неопределенности и риска.1 – Управление риском; 9.2 Классификация рисков; 9.3 – Руководители по отношению к риску; Разработка управленческого решения предполагает использование определенного объема информации.
21869. Качество и эффективность управленческих решений 54 KB
  Качество и эффективность управленческих решений.1 – Понятие управленческого решения и управленческого действия В теории принятия решений выделяют понятия управленческие решения и управленческие действия.2 Качественная оценка эффективности управленческого решения В состав качественных показателей эффективности разработки управленческих решений могут быть включены: своевременность представления проекта решения степень научной обоснованности решений использование научных методов разработки современных подходов ...
21870. Контроль реализации управленческих решений 72 KB
  Понятие содержание цель и функции контроля; 11. Виды контроля и их классификация; 11. Основные принципы и критерии организации контроля; 11. Основные принципы и критерии организации контроля.
21871. Управленческие решения и ответственность 53 KB
  Управленческие решения и ответственность. Ответственность руководителя как элемент процесса принятия и реализации решения; 12. – Ответственности и ее формы в зависимости от сферы деятельности Ответственность категория этики и права выражает особое социальное и моральноправовое отношение личности к обществу. В зависимости от сфер жизнедеятельности людей ответственность имеет ряд форм.
21872. Функции решения в методологии и организации процесса управления 253 KB
  Функции решения в методологии и организации процесса управления.1 Функции решения в методологии и организации процесса управления; 1.2 Понятие управленческого решения и сферы его применения; 1.
21873. Типология управленческих решений 155.5 KB
  Классификация управленческих решений Для разработки и принятия адекватного рассматриваемой проблеме управленческого решения эта работа должна строиться на основе научной классификации управленческих решений. Наиболее широко распространена их классификация по следующим основаниям: сфера деятельности; сроки действия; цели; вид лица принимающего решение ЛПР; уникальность управленческого решения; полнота исходной информации; степень обоснованности решения; ранг управления; масштабность решения; объект...
21874. Условия и факторы качества управленческих решений 47 KB
  Условия и факторы качества управленческих решений. Свойства качественных решений 3. Условия и факторы качества решений 3. Существует показатель косвенно оценивающий качество принятых управленческих решений через количество выполненных решений: Кк = Рв Рн Рп 100 где Кк коэффициент качества управленческих решений; Рп количество принятых управленческих решений; Рв количество выполненных управленческих решений; Рн количество выполненных некачественных решений.