Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_2_изд_испр.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
2.27 Mб
Скачать

15.3. Работа со строками

Здесь будут рассмотрены средства манипулирования со строковыми данными как в языке C, так и в языке Basic. Эти средства группируются по функциональному признаку с тем, чтобы получить представление об общих чертах и отличиях в их реализации на каждом языке. Наряду с новыми средствами будут приведены и описанные ранее. Цель такого изложения материала заключается в том, чтобы свести в одном разделе практически все аспекты обработки символьных данных.

15.3.1. Литералы

Правило записи строковых литералов в языках C и Basic одинаково:

строковый литерал := "<текст>"

Пример.

"Это строковый литерал"

В языке Basic литерал типа string относится к виду строк переменной длины и занимает в памяти (10 + длина строки) байтов.

В языке C любой строковый литерал есть массив символов, заканчивающийся символом '\0', который добавляет транслятор, т.е. его длина в памяти на 1 символ (байт) больше числа символов между кавычками.

Пример.

"Это строка!" (11 знаков)  в памяти будет: Это строка!\0 (12 знаков)

15.3.2. Переменные

Basic

Тип данных string.

2 вида: строки переменной и фиксированной длины.

Объявление:

<имя> as string [*<длина>]

C

Типа данных string нет.

Вместо строковых переменных используются массивы типа char. Следовательно, они аналогичны строкам фиксированной длины языка Basic.

Объявление:

char <имя>[<длина>]

15.3.3. Операторы и функции

Basic

C

Ввод - вывод

Ввод строки в окноInputBox (поясняющий текст[, заголовок окна] [,значение по умолчанию][,xнач] [, yнач]).

Возвращаемое значение: строка, введенная с клавиатуры в поле ввода.

Аргументы:

- если заголовок окна опущен, то в окно помещается имя приложения;

- значение по умолчанию – значение, появляющееся в поле ввода; если пользователь согласен с

этим значением, то, не вводя значение с клавиатуры, нужно щелкнуть по кнопке ОК;

- xнач, yнач – координаты левого верхнего угла окна; если xнач опущено, то окно центрируется по горизонтали; если yнач опущено, то окно располагается примерно на уровне 1/3 от верха экрана.

Файл прототипов stdio.h.

Ввод с клавиатуры:

- функция scanf(спецификация %s);

- функция gets(char*).

Введенное значение заносится

в символьный массив. Обе функции добавляют конечный символ '\0'.

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

Пример. Поэлементное присваивание.

char str1[20], str2[20];

...................................

gets(str1);

for(i=0; str2[ I ]=str1[ I ]; i++);

Пример. InputBox("Число людей в кругу:")

П оясняющий текст: Число людей в кругу.

Заголовок окна: Flavii.

Вывод строки в окноMsgBox (сообщение[, кнопки][, заголовок]).

Возвращаемое значение: код нажатой кнопки. Используется для организации диалога. Изучить самостоятельно.

Аргументы:

- кнопки – целое выражение, кодирующее число и названия выводимых в окно кнопок; если опущено, выводится одна кнопка ОК;

- заголовок – см.функцию InputBox.

Пример. MsgBox("Остался жив №" & nomer)

В ывод на экран:

- функция printf (спецификация %s);

- функция puts(char*).

Также в цикле можно выводить строки с помощью функции putchar (char).

Конкатенация (сцепление)

Оператор &

Файл прототипов для после-дующих функций string.h.

char* strcat(левая строка, правая строка)

Копирование (присваивание)

Оператор =

char* strcpy(копия, оригинал)

Сравнение

Оператор =

Пример.

dim str1 as string, str2 as string

str1="Привет " : str2="семье!"

str1 & str2 "Привет семье!"

if str1 = str2 then ' Результатfalse

Есть 3 режима сравнения строк, которые задаются инструкцией вида:

option compare <режим>

Режимы:

- binary – с учетом регистра (по умолчанию);

- text – без учета регистра;

- database – для MS Access.

int strcmp(строка 1, строка 2)

Возвращаемое значение равно:

- < 0, если строка 1 < строки 2;

- ==0, если строка 1 == строке 2;

- > 0, если строка 1 > строки 2.

Пример.

char str1[20], str[20];

strcpy(str1, "Привет ");

strcpy(str2, "семье!");

strcat(str1, str2); "Привет семье!"

if(strcmp(str1, str2)) str1 != str2

Длина строки

Len(строка)

unsigned strlen(char *);

Возвращает число символов в строке без конечного нуля.

Первое вхождение строки s2 в s1

InStr([начальная позиция,] где ищем, что ищем[, режим сравнения])

Возвращаемое значение: позиция, с которой строка что ищем входит в строку где ищем; если вхождения нет, возвращается 0.

Аргументы:

- начальная позиция – позиция, с которой начинается поиск; если опущена, то поиск с первой позиции;

- режим сравнения := {binary | text | database}; если опущен, то определя-ется инструкцией option compare; если задан, то начальная позиция обязательна.

Пример.

s1="0123456789" : s2="345"

k=InStr(5, s1, s2) ' k=0

char* strstr(где ищем, что ищем);

Возвращаемое значение: указатель на символ, с которого начинается вхождение s2 в s1; если вхождения нет, возвращается NULL.

Пример.

strcpy(s1, "0123456789");

strcpy(s2, "345");

p=strstr(s1, s2);

Формирование строки из повторяющихся символов

Строка из пробелов:

space(число пробелов)

Строка из произвольных повторяющихся символов:

string(число, строка)

Строка строится из первого символа строки.

char* strset(строка, символ)

Другие возможности

Выделение подстрок:

- left(строка, n)n первых символов строки;

- right(строка, n)n последних символов строки;

- mid(строка, начало[, n])n символов строки с позиции начало.

- trim(строка) – удалить пробелы с двух концов строки.

Выравнивание:

Инструкция lset строка1 = строка2

Присваивает строке1 значение строки2 и, если длина строки1 больше длины строки2, лишние "правые" символы заменяются пробелами.

Инструкция rset строка1 = строка2

Делает то же самое, но "прижимает" строку2 к "правой" границы строки1.

Инициализация символьного массива.

char mes[ ]="Это строка!";

Длину массива можно не указывать, транслятор сам определит ее по числу символов инициализирующей строки.

Пример. Определить, являются ли 2 строки анаграммой.

function anagr(str1 as string, str2 as _ string) as boolean

dim len1 as integer, _

len2 as integer, _

i as integer, _

j as integer, _

fl1 as boolean, _

fl2 as boolean, _

sled( ) as boolean

len1=len(str1) : len2=len(str2)

if len1<>len2 then

anagr=false

exit function

end if

redim sled(1 to len1)

for i=1 to len1

sled( i )=false

next

i=1 : fl1=true

do while i<=len1 and fl1

j=1 : fl2=true

do while j<=len2 and fl2

if not sled( j ) and _

mid(str1, i, 1)= _

mid(str2, j, 1) then

sled(j)=true : fl2=false

end if

j=j+1

loop

if fl2 then fl1=false

i=i+1

loop

anagr=fl1

end function

short anagr(char *str1, char *str2){

short len1,

len2,

i, j,

fl1=1,// 1 - анаграмма, 0 - нет

fl2, // 1 - символ в str2 найден,

// 0 - нет

sled[20]; /* 1 - j-й символ в str2

использован, 0 – нет */

len1=strlen(str1); len2=strlen(str2);

if(len1 != len2)return 0;

for(i=0; i<len2; i++)sled[ i ]=0;

for(i=0; i<len1 && fl1; i++){

fl2=1;

for(j=0; j<len2 && fl2; j++){

if(!sled[ j ] && str1[ i ]==str2[ j ]){

sled[ j ]=1;

fl2=0;

}

}

if(fl2)fl1=0;

}

return fl1;

}