Символы и Строки (Char & Strings)
    
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    Правила ЧаВО (FAQ) разделов Паскаля
  
    Символы и Строки (Char & Strings)
    
  | 
         
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         - Символы и Строки - Теория: Язык Турбо Паскаль поддерживает стандартный символьный тип Сhar и, кроме того, строки, описываемые типом String или String[n]. Значение типа Char - это символ из алфавита ЭВМ, заключенный в одинарные кавычки, например, 'A', '7'. Кроме этой классичекой записи существуют еще две. Одна из низ - представление символа его кодом ASCII с помощью префикса #: #97 = Chr(97) = 'a' (символ 'a') #0 = Chr(0) (нулевой символ) #32 = Chr(32) = ' ' (пробел) Символы, имеющие коды от 1 до 31 (управляющие), могут быть представлены их "клавиатурными" обозначениями - значком "^" и буквой алфавита (для диапазона кодов 1..26) или управляющим символом (для диапазона 27..31): ^A = #1 = Chr(1) - код 1 ^B = #2 = Chr(2) - код 2 ... ^Z = #26 = Chr(26) - код 26 ^[ = #27 = Chr(27) - код 27 ... ^_ = #33 = Chr(33) - код 33 Рассмотрим более подробно строковый тип. Максимальный длина строки составляет 255 символов. Строки называются динамическими, поскольку могут иметь различные длины в пределах объявленных границ. Например, введя переменные ![]() ![]() Var  S32  : String[32];  S255 : String[255]; мы может в S32 строчные значения, длиной не более 32 символов, а в S255 - не более 255. Описание String без указания длины отводит место, как и описание String[255]. При попытке записать в переменную строку длиннее, чем было объявлено в описании, "лишняя" часть будет отсечена. Можно присваивать и пустые строки. Их обозначение '' (две одинарных кавычки подряд). Значением строки может быть любая последовательность символов, заключенных в одинарные кавычки: 'abcde' '123332' ' ' '' '''' Последняя конструкция есть строка из одной одинарной кавычки. Можно, вообще говоря, рассматривать строки как массивы символов. Любой символ из строки можно изъять по его номеру: ![]() ![]() Var  I : Byte      ;  S : String[20]; Begin  S := 'Это Массив символов';  For I := 1 to 20 do    WriteLn(S[I]); End. Следует заметить, что в нулевом элементе строки содержится байт, содержащий длину строки. Можно получить длину строки следующим образом: ![]() ![]() Var  L : Byte  ;  S : String; Begin  S := '12345';  L := Byte(S[0]); { В L теперь содержится длина строки, в данном случае - 5 } End. Отдельные символы совместимы с типом char, и над ними можно производить те же действия: ![]() ![]() Var  S  : String;  Ch : Char  ; Begin   S := 'Hello, World!'  Ch := S[1]; { сейчас Ch = 'H' }  S[2] := UpCase(S[2]); { S теперь равна 'HEllo, World!' } End. Заполнение строки одинаковым символом: ![]() ![]() Var  S : String; Begin  FillChar(S[1], 80, 'P'); { Пишем в строку 80 букв P }  S[0] := Char(80); { Устанавливаем длину строки в 80 символов } End.  | 
    
| 
         
         
         
          
           Сообщ.
           #2
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Продолженние строк. Наконец-то  
        
      ![]() Операции над строками Получение длины строки: ![]() ![]() Function Length(S : String) : Integer;  Возвращает длину строки S. Тоже самое можно получить, как было сказано выше, прочитав нулевой байт строки. Пример: ![]() ![]() Var   I : Integer;  S : String ; Begin  S := '12345';  I := Length(S);         { I теперь содержит 5 }  I := byte(S[0]);         { И все равно 5 :) }  {V. S[0] имеет тип char, и нужно явное преобразование до байта.} End. Конкатенация (слияние) строк Чтобы "склеить"две строки достаточно просто применить к ним оператор "+". Например: ![]() ![]() Var  S1, S2, S3 : String; Begin  S1 := 'Мама ';  S2 := 'мыла ';  S3 := S1 + S2;  S3 := S3 + 'раму';  WriteLn(S3);  { Выведет на экран "Мама мыла раму" } End. На самом деле, оператор "+" - эквивалент функции Concat: ![]() ![]() Function Concat(s1, [s2... sn] : String) : String; Несложно догадаться, как она работает: ![]() ![]() Var  S1, S2, S3 : String; Begin  S1 := 'Мама ';  S2 := 'мыла ';  S3 := 'раму';  WriteLn(Concat(S1, S2, S3)); { Выведет на экран все ту же бессмертную фразу } End. Получение части строки ![]() ![]() Function Copy(S : String; Index : Integer; Count : Integer) : String; Возвращает строку, длиною Count символов, вырезанную из строки S, начиная с символа с номером Index. Если Index больше длины строки S, эта функция вернет пустую строку. Если Count больше, чем символов "осталось" в строке, то Copy вернет только "остаток" строки (начиная с Index символа). Пример: ![]() ![]() Var  S, S2 : String; Begin  S := 'Форум на Исходниках.РУ';  S2 := Copy(S, 10, 13); { S2 теперь содержит "Исходниках.РУ" } End. Удаление подстроки ![]() ![]() Procedure Delete(Var S : String; Index : Integer; Count : Integer); Эта процедура удаляет из строки S Count байт, начиная с позиции Index. Если Index больше, чем длина строки, эта процедура ничего не делает. Если Count больше, чем осталось символов в строке, Delete удаляет все символы до конца строки. Использование: ![]() ![]() Var  S : String; Begin  S := 'Мама не мыла раму';  Delete(S, 5, 3); { Удалить из строки S три символа, начиная с пятого. Теперь S равна "Мама мыла раму" } End. Вставка подстроки ![]() ![]() Procedure Insert(Source : String;  Var S : String; Index : Integer); Это процедура вставляет в строку S подстроку Source. Вставка производится с символа с номером Index. ![]() ![]() Var  S : String; Begin  S := 'Мама раму';  Insert('мыла ', S, 5); { ну думаю, совсем несложно догадаться... } End. Примечание. При использовании Turbo Vision нужно часто использовать префикс System, так как многие объекты имеют метод с именем Insert. Например ![]() ![]() System.Insert(params) Поиск подстроки ![]() ![]() Function Pos(Substr : String; S : String) : Byte; Ищет подстроку Substr в строке S и возвращает позицию в строке, где найдено первое вхождение. Если подстрока не найдена, возвращает 0. Пример: ![]() ![]() Var  S : String; Begin  S := 'abacacb';  WriteLn(Pos('ba', S)); { На экран будет выведено 2 } End.  | 
    
| 
         
         
         
          
           Сообщ.
           #3
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Лекция по теме "Строки" с примерами (Word document, 53 кб) 
        
      Материал прислал e-moe, за что ему спасибо. Прикреплённый файл  strings.zip (52.62 Кбайт, скачиваний: 1164)
		 | 
    
| 
         
         
         
          
           Сообщ.
           #4
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Функции модуля Stringz.pas 
        
      ![]() ![]() Function LowCase (C:Char): Char;  { 'StRIng' -> 'string' } Function RUpCase (Ch: Char): Char;  { 'я' -> 'Я' } Function RLowCase (Ch:Char): Char;  { 'Я' -> 'я' } Function RLowStr (S:String): String;  { 'Russian Язык' -> 'русский язык' } Function RUpperStr (s:string): String;  { 'Russian Язык' -> 'RUSSIAN ЯЗЫК' } Function UpStr (S:string): String;  { 'Pascal' -> 'PASCAL' } Function LowStr (s:string): String;  { 'Turbo' -> 'turbo' } Function ReplaceChar (S:String; OldChar,NewChar:char): String;  { Замена в строке S всех символов OldChar на NewChar } Function ReplaceAll (S:string;const Search,Repl:string): String;  { Замена в строке S всех вхождений Search на Repl } Цитата  А вы знаете что в DOS есть функции преобразования строки в верхний   и   нижний  регистры, и если в CONFIG.SYS стоит COUNTRY=007, они корректно работают с русскими буквами. ![]() ![]() Function Upcase (C:Char): Char; assembler; asm    mov AX,6520H    mov DL,C    int 21H    mov AL,DL end; Цитата  А можно за один вызов перевести в верхний регистр целую строку String или PChar. Это подфункции 21H и 22H той же функции 65H Вариант для String приведу, а для PChar пишите сами - он проще. ![]() ![]() Procedure UpString (var S: String); assembler; asm  Push DS  LDS BX,S  XOR CX,CX  MOV CL,[BX] {;Длина строки в CX}  INC BX  MOV DX,BX {; DS:DX- указатель на первый символ}  MOV AX,6521H  INT 21H  POP DS end; Цитата   	 Для подфункции 22H указатель на ASCIIZ строку передается в тех же DS:DX Прикреплённый файл  STRINGZ.zip (0.94 Кбайт, скачиваний: 676)
		 |