Pascal. Delphi. Типы PAnsiChar, PWideChar. Функции работы с ASCIIZ-строками, которые изменяют содержимое строки

Типы PAnsiChar, PWideChar. Функции работы с ASCIIZ-строками, которые изменяют содержимое строки


Содержание


Поиск на других ресурсах:

1. Функция StrCat. Добавление одной строки в конец другой

Функция StrCat добавляет одну строку в конец другой и возвращает указатель на результирующую строку. Функция имеет две реализации для типов PAnsiChar и PWideChar

function StrCat(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar;
function StrCat(Dest: PWideChar; const Source: PWideChar): PWideChar;

здесь

  • Dest – строка-приемник. В эту строку добавляется другая строка Source;
  • Source – строка-источник которая добавляется в конец строки Dest.

Пример.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  ps1 : PAnsiChar; // Объявление переменных типа PAnsiChar
  ps2 : PAnsiChar;
  ps3 : PAnsiChar;
  s : string;
begin
  // 1. Инициализировать переменные ps1, ps2
  ps1 := 'bestprog';
  ps2 := '.net';

  // 2. ps3 = ps1 + ps2
  StrCat(ps3, ps1); // ps3 = 'bestprog'
  StrCat(ps3, ps2); // ps3 = 'bestprog.net'

  // 3. Вывести ps3 на консоль
  Writeln(StrPas(ps3));
  readln;
end.

 

2. Функция StrLCat. Добавить строку в конец другой строки с заданным ограничением на длину результирующей строки

С помощью функции StrLCat можно добавлять одну строку к другой с заданием ограничения на результирующую строку. Для типов PAnsiChar и PWideChar объявления функции следующие

function StrLCat(Dest: PAnsiChar; const Source: PAnsiChar; MaxLen: Cardinal): PAnsiChar;
function StrLCat(Dest: PWideChar; const Source: PWideChar; MaxLen: Cardinal): PWideChar;

здесь

  • Dest – строка-приемник. Это результирующая строка, к которой добавляется строка Source;
  • Source – строка-источник. Эта строка добавляется к строке Dest;
  • MaxLen – максимальная длина результирующей строки.

Функция возвращает указатель на результирующую строку.

Пример.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  ps1 : PWideChar;
  ps2 : PWideChar;
  ps3 : PWideChar;

begin

  // Функция StrLCat

  // 1. Сформировать строки ps1, ps2
  // 1.1. Зарезервировать память размером в 10 символов (20 байт)
  ps1 := WideStrAlloc(10);
  ps2 := WideStrAlloc(10);

  // 1.2. Скопировать данные в строки
  StrCopy(ps1, '12345');
  StrCopy(ps2, '67890');

  // 1.3. Вывести строки ps1, ps2 для контроля
  Writeln('ps1 = ', StrPas(ps1));
  Writeln('ps2 = ', StrPas(ps2));

  // 2. Зарезервировать память для результирующей строки
  ps3 := WideStrAlloc(20);

  // 3. Добавить к результирующей строке строку ps1,
  // в строке ps3 - 3 символа
  StrLCat(ps3, ps1, 3); // ps3 = '123'

  // 4. Добавить к строке ps3 строку ps2,
  //    в строке ps3 максимум 5 символов
  StrLCat(ps3, ps2, 5); // ps3 = '12367'

  // 5. Вывести строку ps3
  Writeln('ps3 = ', StrPas(ps3));

  // 6. Освободить память, ранее выделенную
  //    под строки ps1, ps2, ps3
  StrDispose(ps1);
  StrDispose(ps2);
  StrDispose(ps3);

  Readln;
end.

Результат

ps1 = 12345
ps2 = 67890
ps3 = 12367

 

3. Функции StrLower и StrUpper. Приведение символов к верхнему и нижнему регистрам

Функция StrLower приводит символы строки в нижний регистр, если они находятся в верхнем регистре. Функция StrUpper выполняет обратную операцию по отношению к StrLower и приводит символы строки в верхний регистр. Работа обеих функций относится только к символам латинского алфавита.

Для типов PAnsiChar и PWideChar объявление функции следующее

function StrLower(Str: PAnsiChar): PAnsiChar;
function StrLower(Str: PWideChar): PWideChar;
function StrUpper(Str: PAnsiChar): PAnsiChar;
function StrUpper(Str: PWideChar): PWideChar;

здесь

  • Str – строка, символы которой приводятся к соответствующему регистру.

Пример.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  ps1 : PWideChar;

begin

  // Функции StrLower, StrUpper

  // 1. Сформировать строку ps1
  ps1 := StrNew('ABCdefgh');
  Writeln('ps1 = ', StrPas(ps1));

  // 2. Привести символы строки ps1 к нижнему регистру
  StrLower(ps1);
  Writeln('StrLower(ps1) = ', StrPas(ps1));

  // 3. Привести символы к верхнему регистру
  StrUpper(ps1);
  Writeln('StrUpper(ps1) = ', StrPas(ps1));

  // 4. Освободить память, выделенную для строки ps1
  StrDispose(ps1);

  Readln;
end.

Результат

ps1 = ABCdefgh
StrLower(ps1) = abcdefgh
StrUpper(ps1) = ABCDEFGH

 

4. Функция StrCopy. Копирование одной строки в другую

Функция StrCopy копирует значение одной строки в другую. Согласно документации объявления функции для типов PAnsiChar и PWideChar следующие

function StrCopy(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar;
function StrCopy(Dest: PWideChar; const Source: PWideChar): PWideChar;

здесь

  • Dest – строка-приемник;
  • Source – строка-источник. Обе строки размещаются в разных участках памяти

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

Пример.

В примере демонстрируются разные операции над строками типа PWideChar, а именно:

  • ввод из консоли и конвертирование из типа String в тип PWideChar;
  • получение фрагмента памяти для строки типа String (функция WideStrAlloc());
  • создание строки типа PWideChar;
  • вывод на экран строки типа PWideChar;
  • копирование строк типа PWideChar с помощью функции StrCopy;
  • освобождение памяти, выделенной под строки типа PWideChar.

 

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  ps1 : PWideChar;
  ps2 : PWideChar;
  s : string;

begin
  // Функция StrCopy

  // 1. Создать исходную строку,
  // строка вводится с клавиатуры в консольном приложении
  Write('s = ');
  Readln(s);

  // 2. Конвертировать s => ps1
  // 2.1. Выделить память для строки ps1,
  // размер памяти равен длине строки s
  ps1 := StrNew(WideStrAlloc(Length(s)));

  // 2.2. Скопировать строку s => ps1
  StrPCopy(ps1, s);

  // 3. Выделить память для строки ps2,
  //    размер памяти равен длине строки ps1
  ps2 := StrNew(ps1); // это тоже копирование

  // 4. Вывести строку ps2
  Writeln('ps2 = ', StrPas(ps2));

  // 5. Изменить строку ps1
  ps1[0] := '+';
  ps1[1] := '=';

  // 6. Вывести опять строку ps1
  Writeln('ps1 = ', StrPas(ps1));

  // 7. Скопировать строку ps1 в строку ps2 - функция StrCopy
  StrCopy(ps2, ps1); // ps2 <= ps1

  // 8. Вывести строку ps2 повторно
  Writeln('ps2 = ', StrPas(ps2));

  // 9. Освободить память, выделенную для строк ps1, ps2
  StrDispose(ps1);
  StrDispose(ps2);

  Readln;
end.

Результат

s = 12345
ps2 = 12345
ps1 = +=345
ps2 = +=345

 

5. Функция StrECopy. Копирование одной строки в другую с возвратом указателя на конец строки

Функция StrECopy, равно как и функция StrCopy, копирует одну строку в другую. Особенность этой функции состоит в том, что указатель устанавливается на конец результирующей строки, а не на начало. Объявление функции для типов PAnsiChar и PWideChar следующее

function StrECopy(Dest: PAnsiChar; const Source: PAnsiChar): PAnsiChar;
function StrECopy(Dest: PWideChar; const Source: PWideChar): PWideChar;

здесь

  • Dest – строка-приемник;
  • Source – строка-источник.

Пример.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  ps1 : PAnsiChar;
  ps2 : PAnsiChar;
  ps3 : PAnsiChar;

begin
  // Функция StrECopy

  // 1. Задать строку типа PAnsiChar
  ps1 := AnsiStrAlloc(20);
  StrCopy(ps1, 'ABCD'); // ps1 = 'ABCD'
  Writeln('ps1 = ', ps1);

  // 2. Установить указатель ps2 на начало строки ps1
  ps2 := ps1;
  Writeln('ps2 = ', ps2);

  // 3. Дописать к строке ps1 строку 'DEF'
  StrECopy(ps1, 'DEF');
  Writeln('StrECopy(ps1, ''DEF'')');
  Writeln('ps1 = ', ps1); // ps1 = DEF
  Writeln('ps2 = ', ps2); // ps2 = DEF - указатель ps2 также сместился

  Readln;
end.

Результат

ps1 = ABCD
ps2 = ABCD
StrECopy(ps1, 'DEF')
ps1 = DEF
ps2 = DEF

 

6. Функция StrLCopy. Копирование заданного количества символов из одной строки в другую

Функция StrLCopy предназначена для копирования заданного количества символов из исходной строки в результирующую строку. Спецификация функций для типов PAnsiChar и PWideChar имеет вид

function StrLCopy(Dest: PAnsiChar; const Source: PAnsiChar; MaxLen: Cardinal): PAnsiChar;
function StrLCopy(Dest: PWideChar; const Source: PWideChar; MaxLen: Cardinal): PWideChar;

здесь

  • Dest – строка-приемник;
  • Source – строка-источник;
  • MaxLen – количество символов строки Source, копируемых в строку Dest.

Пример.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  ps1 : PWideChar;
  ps2 : PWideChar;

begin
  // Функция StrLCopy

  // Исходная строка
  ps1 := StrNew('Hello, world!');

  // Создать новую строку
  ps2 := StrNew(ps1);

  // Скопировать первые 5 символов строки ps1 => ps2
  StrLCopy(ps2, ps1, 5); // ps2 = 'Hello'

  Writeln('ps1 = ', StrPas(ps1));
  Writeln('ps2 = ', StrPas(ps2));

  Readln;
end.

Результат

ps1 = Hello, world!
ps2 = Hello

 

7. Функция StrMove. Переместить одну строку в другую

Функция StrMove перемещает последовательность символов из исходной строки в целевую строку. Объявление функции для типов PAnsiChar и PWideChar имеет вид

function StrMove(Dest: PAnsiChar; const Source: PAnsiChar; Count: Cardinal): PAnsiChar;
function StrMove(Dest: PWideChar; const Source: PWideChar; Count: Cardinal): PWideChar;

здесь

  • Dest – строка-приемник;
  • Source – строка-источник;
  • Count – количество символов которые нужно скопировать.

Функция возвращает указатель на целевую строку. Функция не уничтожает исходную строку Source.

Пример.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  ps1 : PWideChar;
  ps2 : PWideChar;

begin
  // Функция StrMove

  // 1. Сформировать строку ps1
  ps1 := StrNew('ABCDEFGH');
  Writeln('ps1 = ', StrPas(ps1));

  // 2. Выделить фрагмент памяти для строки ps2
  //    Размер фрагмента равен длине строки ps1
  ps2 := WideStrAlloc(StrLen(ps1));

  // 3. Перенести данные из строки ps1,
  //    переносится 5 символов
  StrMove(ps2, ps1, 5);

  // 4. Прибавить символ '\0' в конец строки ps2
  ps2[5] := #0;

  // 4. Вывести строки
  Writeln('ps2 = ', StrPas(ps2));
  Writeln('ps1 = ', StrPas(ps1));

  // 5. Освободить память, выделенную для строк ps1, ps2
  StrDispose(ps1);
  StrDispose(ps2);

  Readln;
end.

Пример.

ps1 = ABCDEFGH
ps2 = ABCDE
ps1 = ABCDEFGH

 


Связанные темы