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