Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Функции обработки строк ⇐ ПредыдущаяСтр 2 из 2
Для работы со строками символов в библиотеке 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*/ 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));
|