IPB
ЛогинПароль:

> Строки
Altair
сообщение 16.06.2004 17:09
Сообщение #1


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Строки. Краткая теория.

В Паскале определены два типа строк:
  • Тип String
  • тип PChar
I. String

Стандартная строка (string) в Паскале, представляет из себя массив, первый элемент которого содержит длину строки, а начиная со второго элемента начинается полезная информация. Поскольку нумерация начинается с 0, то первый элемент строки, содержащий длину строки, имеет индекс 0.

Если Вы попытаетесь осуществить следующее присвоение:
var
s:string;
I:byte;
begin
readln(s);
i:=s[0];
end.

то компилятор выдаст сообщение об ошибке (несовместимость типов), потому что
все элементы строки - символы (Char)

Для определения длины строки можно использовать или стандартную процедуру Length(stroka) или так:
var
dlinna_stroki:byte
s:string;
begin
readln(s); {вводим строку}
dlinna_stroki:=Ord(s[0]);
end.


Второй способ менее нагляден, но полезен если Вы забыли стандартные процедуры.

К каждому элементу строки можно обратиться, как к элементу массива. Длина строк ограниченна 255 символами. Поскольку первый элемент строки кодируется одним байтом, он может закодировать максимум 255 элементов.

II. PChar
Для обеспечения поддержки строк, длиннее 255 символов, в TP7 был введен новый тип - PChar. Он имеет следующую структуру:
Type
PChar = ^Char;


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

Тип PChar совместим с одномерным символьным массивом с нулевой левой границей (array[0..max]).

Переменные типа PChar индексируются, т.е. к элементам длинной строки можно обратиться по их индексу, как к элементам обычной строки.

СТРОКИ. ЧаВо.
  • После посимвольного ввода строки, не получается вывести ее на экран. В чем дело?
    При посимвольном вводе строки, Вы забыли указать длину получившейся строки
    s[0]:=chr(dlinna)

    Или иначе, при вводе:
    {...}
    {ввод очередного символа}
    {...}
    Inc(S[0]);
  • Почему не получается индексировать длинную строку?
    Включите расширенный синтаксис директивой {$X+} или в настройках компилятора
  • Есть какие-нибудь процедуры для работы с длинными строками?
    Да, есть. В модуле strings
  • Как вывести длинную строку на экран?
    Процедурой Writeln, при включенно расширенном синтаксисе.
  • Сколько занимает в памяти строка?
    Для обычных строк, если не указана длина строки, то 256 байт.
    Если, при описании переменной, указана длина строки явно (string[8]), то столько, сколько указано +1 байт на нулевой элемент (хранение длинны строки).
    Для PChar размер в памяти равен количеству элементов до символа #0 +1 байт.
  • Как перевернуть строку?
    (с использованием второй строки):
    var
    s,f: string;
    i,j: byte;
    begin
    readln(s); j:=1;
    for i:=length(s) downto 1 do begin
    f[j]:=s[i]; inc(j);
    end;
    f[0]:=chr(j);
    writeln(f);
    end.


    (from APAL с использованием одной строки и одной переменной типа Char):
    var
    s:string;
    f:Char
    i:byte;
    begin
    readln(s);
    for i:=1 to Length(s) div 2 do begin
    f:=s[i];
    s[i]:=s[Length(s)-i+1];
    s[Length(s)-i+1]:=f;
    end;
    writeln(s);
    end.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 9.11.2024 17:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"