Хранение параметров в строке

Другое   27 Декабрь 2010  Автор статьи: admin 

В этом уроке я покажу как хранить несколько параметров в одной строке.

Для начала разберемся, что же мы подразумеваем под хранением параметров в строковой переменной. Предположим, у нас имеется переменная s:string, которая хранит в себе следующую строку:

param1=100 param2=abcdef param3=a1b2c3d4

Как  вы уже наверное заметили, содержимым переменной является ряд параметров и их значений. Цель этого урока будет заключаться в том, чтобы научиться извлекать все параметры и их значения из строки. Хранение параметров в одной строке удобно использовать при хранении каких-либо данных или передаче совокупности данных посредством сети.

Рассмотрим повнимательней строку с параметрами:

param1=100 param2=abcdef param3=a1b2c3d4

Синим цветом выделены параметры, зеленым — их значения, желтым — разделяющие параметры пробелы.

Начнем с простого.  Пусть пока в нашей строке есть только 1 параметр. Тогда строка будет выглядеть так:

param1=100

Тогда всю строку, состоящую только из 1 параметра можно поделить на 3 подстроки: название параметра, разделяющий знак «=» и значение параметра. Получить название и значение единственного параметра очень просто. Для этого напишем следующие функции:

function TForm1.gname(s: string; ch: char='='): string;
begin // получение имени параметра
Result := copy(s, 1, pos(ch, s) - 1);
end;
function TForm1.gval(s: string; ch: char='='): string;
begin // получение значения параметра
Result := copy(s, pos(ch, s) + 1, length(s));
end;

Но т.к. наша задача состоит в считывании не одного, а нескольких параметров, нам прийдется усложнить наш код. Теперь перейдем к работе с несколькими параметрами. Для этого сначала узнаем их количество. Если внимательно рассмотреть строку с параметрами, то можно заметить, что кол-во параметров зависит от количества разделяющих знаков (пробелов) между ними минус 1. Напишем функцию нахождения количества определенных знаков в строке:

function TForm1.getnumofsymbols(s: string; ch: char): integer;
var
i: integer;
begin
Result := 0;
for i := 1 to length(s) do
begin
if s[i] = ch then
inc(Result);
end;
end;

Функция достаточно проста, и следует отметить лишь, что в ch:char надо заносить сам разделяющий знак. Таким образом получим, что количество параметров в строке будет:

n:=getnumofsymbols(s,' ')-1;

Теперь напишем функцию извлечения параметра из строки, зная его числовой индекс:

function TForm1.getparam(s: string; n: integer; ch: char = ' '): string;
var
i, a1, m, nn: integer;
A: string;
begin
if pos(ch, s)<> 0 then
begin
m := 1;
A := '';
for i := 1 to length(s) do
begin
if s[i] = ch then
begin
inc(m);
continue;
end
else if m = n then
A := A + s[i]
else if (m = n) and (s[i] = ch) then
break;
end;
Result := A;
end
else
begin
if n = 1 then
Result := s
else
Result := '';
end;
end;

В параметр функции s вносим строку с параметрами, в n вносим индекс параметра, в ch знак разделитель параметров.

Но нам было бы удобнее находить значение параметра не по его индексу, а по его названию. Именно для этого нам пригодится следующая функция:

function TForm1.getvalue(name,s: string): string;
var
i, n: integer;
begin
Result := '';
n:=getnumofsymbols(s,' ')-1;

for i := 1 to n do
if (gname(getparam(s, i)) = name) then
Result := gval(getparam(s, i));
end;

Эта функция перебирает все имена параметров из строки s, сравнивает их с name, и, если название параметра соответсвует name, то находит его значение и отправляет в result.

Пример использования написанных функций:

s:= 'param1=100 param2=abcdef param3=itworks!';
showmessage(getvalue('param3',s));

В результате программа должна будет вывести фразу «itworks!».

Научиться программировать

  • на Delphi

  • на Java

  • на C++