Практика программирования (Бейсик, Си, Паскаль)

       

Обработка фрагментов строк


Под фрагментом строки понимают цепочку символов заданной длины, выделенную из исходной строки, начиная с указанной позиции. В частности, выделяемый фрагмент может состоять и из единственного символа. Кроме выделения фрагмента тем или иным способом к числу наиболее распространенных операций относятся действия по определению длины строки, объединению (конкатенации) символьных цепочек и поиску вхождения одной строки в другую.

В QBasic для выделения фрагментов используют системные функции LEFT? (выделение левой подстроки), RIGHTS (выделение правой подстроки) и MID$ (выделение внутренней подстроки). Последняя функция может выступать и в роли оператора, заменяющего старый фрагмент новым значением. Например:

LЕFТ$("Вася",1) 'выделяет "В"

LЕFТ$("Вася",2) 'выделяет "Ва"

RIGHT$("Вася",1) 'выделяет "я"

RIGHT?("Вася",2) 'выделяет "ся"

MID$("Вася",2,2) 'выделяет "ас"

MID$("Вася",3)="илиса" 'заменяет на "Василиса"

Функция (оператор) MID$ позволяет опустить третий аргумент, и тогда в соответствующей операции участвуют все конечные символы, начиная с ука-занного. В операторе MID$ присваиваемое значение может быть пустым, что эквивалентно удалению фрагмента.

В Паскале для выделения подстроки используется функция сору, аналогичная функции мю$:

s2 := copy('Вася',2,3); {выделяется 'ася'}

Для удаления или вставки фрагмента здесь используются процедуры delete

И insert: delete(s1,start,len);{удаляется len символов, начиная с позиции start} insert(s1,s2,start);{в строку s2, начиная с позиции start, вставляется строка s1}



Функции работы со строками в Си включены в состав заголовочного файла string.h. Для копирования строки или ее части в другую здесь можно воспользоваться одной из следующих функций:

strcpy(s1,s2); //копирует строку s2 в строку s1

strncpy(s1,s2,n); //копирует первые п символов из строки s2 в s1

Задавая аргумент-источник не ссылкой на начало символьного массива, а адресом любого его элемента, мы можем скопировать либо правую, либо среднюю подстроку:




strcpy(s1, &s2[k]); // копирует правую подстроку из s2 в s1

strncpy(s1, &s[2],n); //копирует среднюю подстроку из s2 в s1

Длина строк в рассматриваемых системах программирования определяется одной из системных функций LEN (QBasic), Length (Паскаль) или strlen (Си). Единственным аргументом у каждой из них является анализируемая строка.

Для конкатенации (объединения) строк в Паскале и QBasic используется довольно естественная операция сложения:

А$="Здравствуй, "+NAME$+"!" s1:='3дравствуй, '+nаmе+'!'

В Си эта операция реализуется с помощью одной из следующих функций:

strcat(s1, s2); //добавляет s2 к s1

strncat(s1, s2, n); //добавляет и первых символов из s2 к s1

Поиск вхождения одной строки в другую дает ответ на вопрос, содержится ли значение одного текста в другом и с какой позиции обнаружено это вхождение. Нулевая позиция в качестве результата такой операции соответствует отрицательному ответу.

Функция, определяющая в QBasic, входит ли значение строки А2$ в строку А1$, имеет вид:

INTSR(A1$,A2$) или INSTR(k,Al$,А2$)

В первом случае анализ вхождения ведется с начала строки AI$, во втором случае — начиная с k-й позиции строки AI$. Последний вариант позволяет последовательно определить все вхождения искомого образца.

Примерно такими же возможностями обладает функция pos(si,s2) в Паскале. Для поиска повторного вхождения можно удалить уже исследованный фрагмент и снова обратиться к функции роз.

Гораздо более разнообразные варианты поиска вхождений предлагает Си:

strstr (s1,s2); //ищет вхождение строки s2 в s1

strchr(s1,с); //ищет вхождение символа "с" с начала строки s1

strrchr(s1,с); //ищет вхождение символа "с" с конца строки s1

strpbrk(s1,s2); //ищет вхождение любого символа из s2 в s1

strspn(s1,s2); //ищет вхождение любого фрагмента, составленного

//из символов s2 в s1


Содержание раздела