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

 


Споріднені теми