Наш спонсор. Рекомендуем посетить.

120x90-p1m002.gif (13061 bytes)

Партнерская программа для русскоязычных сайтов

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

В языке Паскаль, строковый тип описывается, например: S:string[255];, где 255 – максимальное количество символов в строке, и плюс ещё один байт, необходимый для указания длинны строки. Таким образом, размер памяти, занимаемой переменной string равен 256 байтам. При необходимости, данное значение длинны может быть и меньше, но никак не больше 255. Кроме того, в Паскале существует функция, позволяющая определить количество элементов (длину) строки.

В отличие от языка Паскаль, язык Си не использует строковый тип данных. Но он позволяет определить строки двумя различными способами: используя массив символов; используя указатель на первый символ массива.

Объявление char a[10]; указывает компилятору, на необходимость зарезервировать место для 10 символов, из которых последний будет нулевым (т.е. \0). Константа a содержит адрес ячейки памяти, в которую помещено значение первого из 10 объектов типа char.

На рисунке иллюстрируется сказанное для массива, содержащего слово “Минск”.

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

При выполнении функции printf(“%S”,a);, ей передаётся значение a, т.е. адрес первого символа, на который указывает константа а.

Если символ не нулевой, то функция выводит его на экран, прибавляет к адресу единицу, и снова начинает проверку на нулевой символ. Если же символ равен нулю, то функция printf работу прекращает. Такая обработка позволяет снять ограничение на длину строки (естественно в пределах объявленной размерности). Строка может быть любой длинны до тех пор, пока ей хватает места в памяти, куда её можно поместить.

При втором способе определения строки объявление char *b; задаёт переменную b, которая может содержать адрес некоторого объекта. Однако в данном случае компилятор не резервирует места для хранения символов и не назначает переменной конкретного значения.

Когда компилятор встречает инструкцию b=’Минск’;, он производит следующие действия:

  1. Как в предыдущем случае, создаёт в каком-либо месте объектного модуля строку “Минск”, за которой следует нулевой символ;
  2. Присваивает значение начального адреса этой строки переменной b.

Функция printf(“%s”,b); работает так же, как и в предыдущем случае, пока не встретится заключительный нуль.

Как уже говорилось выше, в языке Паскаль, для определения длинны строки, используется специальная функция length(s);. В языке Си для этого можно использовать уже знакомый нам оператор sizeof. Как это происходит, можно посмотреть на примере следующей программы.

Рассмотрим некоторые различия в наших программах.

В программе на Паскале, оператор sizeof определяет не размер памяти, как мы привыкли, а размер строки. В операторе letters:=length(name); происходит присваивание результата работы функции length переменной name. Аргумент функции заключен в скобки. В данном случае аргумент – строка, а результат работы функции – число символов, соответствующее длине строки.

Напомним, что над строками в языке Паскаль определена операция конкатенации (склейки), обозначаемая символом “+”.

В программе на Си, используемый нами ранее оператор sizeof, определяет размер памяти, занимаемый массивом. Размер памяти, занимаемый массивом, равен размеру памяти, занимаемому одним элементом массива, умноженному на количество элементов массива. Обратите внимание, что имя массива (name) после оператора не заключено в скобки (size=sizeof name;). Использование скобок зависит от того, что надо узнать: размер памяти, отводимый под элемент конкретного типа (в этом случае скобки необходимы), или размер памяти, занимаемый переменной или константой (тогда скобки не нужны).

Следующий оператор letters=strlen(name); присваивает результат работы функции strlen переменной letters. О том, что имя strlen является именем функции, говорит наличие круглых скобок после её имени. В скобках заключён аргумент функции.

Аргументом функции (входным параметром) является имя строки, а результатом её работы – длина строки в виде числа символов, содержащихся в строке. Один символ занимает один байт памяти, и, следовательно, для размещения всей строки будет отведено число байт равное длине строки плюс один. Этот дополнит6ельный байт необходим для размещения в нём нулевого символа (об этом уже говорилось выше). Появление нуль-символа служит сигналом для функции strlen прекратить подсчёт символов. Сведения о функции размещены в файле string.h, который вызывается с помощью команды препроцессора #include. Также следует обратить внимание на спецификацию для ввода и вывода строки “%s”, используемых функциями scanf и printf.

Google
Rambler's Top100 Яндекс цитирования PageRank

Регистрация доменов .RU по минимальной ценеРегистрация в системе обмена ссылками