Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

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

#include < stdio.h>

#include < conio.h>

#include < string.h>

main()

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

char *s;

gets(s1);

printf (" Dlina stroki = %d\n", strlen(s1));

gets(s2);

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

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

puts(s);

gets(s3);

if (strcmp(s1, s3)==0)

printf(" Stroki rani\n");

}

 

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

char *strcat (char *s1, char *s2); Функция копирует строку s2 (на которую ссылается указатель s2) в конец строки s1 и возвращает значение s1 – ссылку на сцепленную строку.

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

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

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

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

while (*sl! =’\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 (*sl! =’\0’)

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

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

return rs;

}

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

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

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

Полный текст программы выглядит следующим образом:

#include < stdio.h>

#include < string.h>

#include < conio.h>

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;

}

main()

{char st1[80], st2[80], rs[160];

gets(st1);

gets(st2);

*strcat(st1, st2);

puts(st1);

getch();

}

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

#include< stdio.h>

main()

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

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

gets(str1);

gets(str2);

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

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

puts (strcat(strl, str2));

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

}

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

getch();

}

Пример

// Замена строчных букв на заданный символ

char *zamenaBukv(char *str, char sim)

{int i;

for(i=0; str[i]; i++) //str[i]! =’\0’

if (str[i]> =’a’& & str[i]< =’z’) str[i]=sim;

return str;

}

//второй вариант замены букв

char *zamenaBukv(char *str, char sim)

{char *s;

for(s=str; *s! =’\0’; s++)

if (*s> =’a’ & & *s< =’z’) *s=sim;

return str;

}

//Вызов

char c, s[81];

gets(s);

c=’*’;

puts(zamenaBukv(s, c));

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.