Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.13;
Скачать: CL | DM;

Вниз

Как можно разбить строку на символы?   Найти похожие ветки 

 
z.Evgen   (2003-12-19 08:45) [0]

Имеется переменная String как ее разбить на символы?


 
MBo ©   (2003-12-19 08:47) [1]

F1 по String types


 
Sens ©   (2003-12-19 08:49) [2]

Можешь сразу обращатсья к каждому сиволу string[i], а можешь затосовать в массив, хотя строка - это и есть массив символов!

for i:=0 to string.length do
Begin
a[i]:=string[i];
End


 
MBo ©   (2003-12-19 08:56) [3]

>Sens
Может, не стоит приводить код, в котором и смысла нет, и ошибок больше, чем строк?


 
Спрашивающий_   (2003-12-19 09:22) [4]

procedure TForm1.Button1Click(Sender: TObject);
var
M:array of Char;
I:Byte;
S:String;
begin
Text:="";
S:=Edit1.text;
SetLength(M,Length(S));
For I:=1 To Length(S) Do
begin
M[I]:= S[I];
Text:=Text+"Char #"+IntToStr(I)+"="+M[I]+" ";
end;
Text:=Text+"Неужели все так просто!!!"
end;


 
Спрашивающий_   (2003-12-19 09:25) [5]

Динамический массив это так от нечего делать, в его реализации есть ошибки!


 
alex_***   (2003-12-19 09:29) [6]

даже сложнее чем можно.. CopyMemory(@m[0], @s[1],length(s))


 
Polevi ©   (2003-12-19 09:32) [7]

ужас


 
Anatoly Podgoretsky ©   (2003-12-19 09:39) [8]

Polevi © (19.12.03 09:32) [7]
Пока еще нет.


 
REA ©   (2003-12-19 10:21) [9]

TSymbolicStringToCharCoolParser = Class(TInterfacedObject)
Procedure GetStringAndSplitOntoSeparateCharsASAP();


 
TUser ©   (2003-12-19 11:06) [10]

progressBar1.min:=1;
progressBar1.max:=length(str);
progressBar1.position:=1;
for i:=Low(integer) to high(integer) do begin
if i<1 then label1.caption:="Ничего не делаем, отдыхаем"
else if i<length(str)+1 then begin
progressbar1.position:=i;
label1.caption:=inttostr(i)+"-й сивол - это "+str[i];
end else label1.caption:="Успели прочитать?"
end;


 
Masik2003   (2003-12-19 11:22) [11]

var
S: String;
C: Char;

...
S[N] - где N-нужный символ


 
Нурик ©   (2003-12-20 07:10) [12]

Возьмите ножницы и разрешьте на куски этот стринг!


 
cyberwolf   (2003-12-20 14:31) [13]

Вообще-то строка - это массив символов. То есть следующие переменные...
var
s1: string;
s2: array[0..255] of char;
...будут равны.

Чтобы обратиться к отдельному символу строки используй следующую структуру (пример):
s1[2] - обращение к 2 символу строки.


 
Anatoly Podgoretsky ©   (2003-12-20 14:45) [14]

Polevi © (19.12.03 09:32) [7]
Вот теперь уже ближе к истине.


 
jack128 ©   (2003-12-20 15:01) [15]

Разрешите поздравить Rouse_ c пополнением коллекции


 
easy ©   (2003-12-20 15:10) [16]

=)


 
Verg ©   (2003-12-20 15:25) [17]


> Sens © (19.12.03 08:49) [2]



> Спрашивающий_ (19.12.03 09:22) [4, 5]


Вам с этим надо срочно что-то делать! :(


 
Style ©   (2003-12-20 16:54) [18]

Вот еще классный метод :)

procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
symstr: pchar;
i: integer;
type
PStrRec = ^StrRec;
StrRec = packed record
refCnt: Longint;
length: Longint;
end;
const
skew = sizeof(StrRec);
SEPARATOR = CHR($20);
function StrLen(const s: AnsiString): Longint;
asm
TEST EAX,EAX
JE @@done
MOV EAX,[EAX-skew].StrRec.length;
@@done:
end;
begin
str := "Имеется переменная String как ее разбить на символы?";

GetMem(symstr,(StrLen(str)*3)+1);
FillMemory(symstr,(StrLen(str)*3)+1,$20);
for i := 0 to StrLen(str) do
begin
CopyMemory(Pointer(integer(symstr) + (i*3)), Pointer(integer(pchar(str))+i),1);
end;
Caption := symstr;
FreeMem(symstr);
end;


 
Marser ©   (2003-12-20 17:45) [19]

Как говорил Chubais:"ААААААААААААААААААААА!"
Разрешите присоединиться к jack128 © ([15]) :-)
Особенно порадовал первый ответ, достойный "Розвой коллекции" и "Орешника". Воистину, недалеко ушел от задающего тупые вопросы серьёзно и подробно на них отвечающий.


 
Knight ©   (2003-12-20 18:15) [20]

Почему-то вспомнился один вопрос... Как лучше сказать?

1) Представитель, распространённого на планете Земля, отряда парнокопытных осуществляет процесс удовлетворения потребности своего организма в воде, путём создания разряжения в полости рта и всасывания её из предмета цилиндрической формы, радиусом большим, чем окружность морды...

или

2) Лошадь пьёт из ведра.

:)


 
Евлампия Никифоровна   (2003-12-20 18:36) [21]

Меня тоже волновала эта проблема. Я обратилась к одному профессионалу Delphi, и он мне дал замечательную функцию получения n-го символа строки. Функция работает безупречно и довольно быстро. Спасибо, что есть такие хорошие люди.

function GetSimbolN(N: Integer; const S: string): char;
{
N - номер того самого символа, который необходимо получить;
S - та самая строка из которой получаем символ.
}
var i, n: integer;
b: Boolean;
begin
for i := 0 to n*(Length(s)+1) do
begin
b := False;

if (i < n) and (sin(i*Pi) > 1) then
b := Boolean(Integer(True)*117);

if (i > n) and (cos(i*Pi) < -1) then begin
b := Boolean(Integer(False)*117);
Result := GetSimbolN(i-2, s);
end;

if (i = n) and (sin(123*i-n) <= 1) then
b := True;

if b = true then
if (n > 0) and (n < Length(s)) then
Result := s[(32 div 8)*1 - 8 + i];

if b = False then
Continue;
end;
end;


А вот и разбивка всей строки. Я сама додумалась!


var
n, i: Integer;
chars: array of char;

begin
n := High(s)+1;
SetLength(chars, n);
for i := 1 to n do
begin
chars[i-1] := GetSimbolN(i, s);
end;
end;


Если будут вопросы, обращайтесь. Помогу всем!

С уважением,
Евлампия Никифоровна.


 
Евлампия Никифоровна   (2003-12-20 18:40) [22]

Извиняюсь, ошибка
Надо вот это
Result := s[(32 div 4)*1 - 8 + i];
Иначе даст не то, что надо!


 
panov ©   (2003-12-20 20:00) [23]

>Евлампия Никифоровна
А под своим ником не судьба напсиать?


 
Евлампия Никифоровна   (2003-12-20 20:29) [24]

> panov © (20.12.03 20:00) [23]

Напиши я под своим ником, Вы бы не задали этот вопрос, а я бы не узнала, что Вас волнует. :)))


 
Евлампия Никифоровна   (2003-12-20 20:38) [25]

Кстати, Евлампия - это тоже, что Липа :))

> panov ©

Да и как я могла написать под своим
именем столь тупую шутку?
Неохота портить драгоценный ник. :-))
Глупо всегда ходить в одной маске.
В Единственной. Тем более в интернете..


 
Nous Mellon ©   (2003-12-20 20:40) [26]


> [25] Евлампия Никифоровна (20.12.03 20:38)
> Кстати, Евлампия - это тоже, что Липа :))

Интересно, кто же вы на самом деле? :)


 
Slavian ©   (2003-12-20 20:43) [27]


> Евлампия Никифоровна (20.12.03 18:36) [21]

такой громадный текст, а получается то же что написать, взяв те же названия параметров:

Chars:= s[N];


 
Nous Mellon ©   (2003-12-20 20:45) [28]


> такой громадный текст, а получается то же что написать,
> взяв те же названия параметров:

В обще то это был прикол


 
Евлампия Никифоровна   (2003-12-20 20:45) [29]

> Slavian © (20.12.03 20:43) [27]

Это, что, шутка?
Я, неделю работала с этой проблемой!
Я, лучше Вас разбираюсь!
Мой код самый, оптимальный!


 
P.N.P. ©   (2003-12-20 21:38) [30]

Орешник 100 пудов :)))))))


 
Slavian ©   (2003-12-20 21:38) [31]

ну-ну!


 
SergP ©   (2003-12-20 22:49) [32]

:-) Жаль что все гениальные мысли уже были высказаны, а то так хотелось самому что-то "всунуть" в эту ветку.
А вообще мне вспомнилась ветка про то как просканировать порты. Давно это было. Но прикольно...


 
Ломброзо ©   (2003-12-20 23:15) [33]

а я знаю, кто такая Евлампия.


 
Евлампия Никифоровна   (2003-12-20 23:16) [34]

Я вся внимание :))


 
имя   (2003-12-20 23:20) [35]

Удалено модератором


 
Anatoly Podgoretsky ©   (2003-12-20 23:21) [36]

Липа (20.12.03 23:20) [35]
Диагноз или имя хочешь?


 
Ломброзо ©   (2003-12-20 23:23) [37]

Евлампия, что Вы так напряглись-то? :-))) Я в шаббат разобл#чений не практикую )


 
Липа   (2003-12-20 23:23) [38]

Конечно, диагноз.
Своё имя я сама неплохо знаю.


 
Ломброзо ©   (2003-12-20 23:24) [39]

publicных, в шмышле


 
имя   (2003-12-20 23:26) [40]

Удалено модератором


 
Ломброзо ©   (2003-12-20 23:31) [41]

LMD и RTFM


 
имя   (2003-12-20 23:36) [42]

Удалено модератором


 
Ломброзо ©   (2003-12-20 23:45) [43]

Аспейсиба, я не знал.


 
Ломброзо ©   (2003-12-20 23:49) [44]

Подозрительный сайтик. Поместите егой в топку.


 
kaif ©   (2003-12-21 04:17) [45]

z.Evgen (19.12.03 08:45)
Имеется переменная String как ее разбить на символы?


Делением пополам!
Сначала разбиваешь на символы до length div 2 и после length div 2, затем рекурсивно вызываешь эту процедуру для каждой половины. И так, пока не останется один символ. Это самый правильный и крутой метод. Так как все правильные методы используют деление отрезка пополам, а все крутые методы используют рекурсивные вызовы.
К тому же при пошлых и тривиальных решениях тебе пришлось бы резервировать ресурс под переменную для цикла for:

var
i: integer;


Рекурсивный вызов позволяет этого избежать и поэтому экономит минимум 4 байта оперативной памяти, отводимой под эту переменную.
И тебе не придется думать о длине этой переменной! И длине строки тоже!
ИМХО, реализация с рекурсивным вызовом самая универсальная, так как даже с переходом на платформы Win64, Win128 и Win256 исходный код не придется менять.
Существуют объектно-ориентированные языки программирования, в которых вообще нет циклов и все делается вызовом рекурсивных процедур. Так что этот код еще легко будет переводить на такие языки, что делает его универсальным.


 
Knight ©   (2003-12-21 19:59) [46]

Люди... Можно как-то избавиться от объявления типа, но чтобы при этом функция продолжала работать? И вообще, доработайте кто что может. :)


type TStrArr=Array of String;

function Explode(Sep:Boolean; Str:String):TStrArr;
var i,Len:Integer;
S:String;
begin
Result:=nil;
Len:=Length(Str);
if not Sep then begin
SetLength(Result,Len);
for i:=1 to Len do begin
Result[i-1]:=Str[i];
end;
end else if (Sep and (Len>0)) then begin
S:="";
for i:=2 to Len do begin
if (Str[i]=Str[1]) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=S;
S:="";
end else if (i=Len) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=S+Str[i];
end else S:=S+Str[i];
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var A:TStrArr;
i:Integer;
begin
Memo1.Clear;
A:=Explode(false," Имеется переменная String как ее разбить на символы?");
for i:=0 to Length(A)-1 do Memo1.Lines.Append(A[i]);
A:=nil;
end;


 
имя   (2003-12-21 21:20) [47]

Удалено модератором


 
Knight ©   (2003-12-21 21:42) [48]

Немного подправил разбивку по сепаратору... стало немного короче :)
Для тех кто не понял кода... Sep-указывает, что первый символ использовать как разделитель и бить строку по нему, если он False, то строка Str бьётся на символы...


function Explode(Sep:Boolean; Str:String):TStrArr;
var i,k,Len:Integer;
begin
Result:=nil;
Len:=Length(Str);
if not Sep then begin
SetLength(Result,Len);
for i:=1 to Len do begin
Result[i-1]:=Str[i];
end;
end else if (Sep and (Len>0)) then begin
k:=1;
for i:=2 to Len+1 do begin
if (i=Len+1) or (Str[i]=Str[1]) then begin
SetLength(Result,Length(Result)+1);
Result[High(Result)]:=Copy(Str,k+1,i-k-1);
k:=i;
end;
end;
end;
end;


 
Knight ©   (2003-12-21 21:56) [49]

Что? Как потрепаться, так народу куча, а как... так никого? :(


 
Nous Mellon ©   (2003-12-21 22:05) [50]


> Что? Как потрепаться, так народу куча, а как... так никого?
> :(

Фишка в том что трепка расслабляет, а когда надо писать код думаешь может лучше полезть в свой незаконченный проект и сделать там что-нибудь полезное чем давать прикольные, но в общем то ненужные советы


 
Knight ©   (2003-12-21 22:37) [51]

>> Nous Mellon © (21.12.03 22:05) [50]
А при чём тут приколы? Я на полном серьёзе... :|
Понадобилась функция, аналогичная Explode в PHP, для разбивки стринга, заодно и сюда закинул.


 
SergP ©   (2003-12-22 02:24) [52]


> Knight © (21.12.03 21:56) [49]
> Что? Как потрепаться, так народу куча, а как... так никого?
> :(


Вот-вот... Стоит задать серьезный вопрос как все начинают его игнорировать... А потрепаться - то все слетаются как мухи на ... мед. Удивляюсь только как это всем не лень приводить такие длинные коды, это же написать такое нужно сначала!!! Причем с целью просто поприкалываться

...Может я свои вопросы неправильно формулирую... Нужно будет попробовать методом сабжа... Тогда и ответов куча будет. (Правда бесполезных) :-(



Страницы: 1 2 вся ветка

Текущий архив: 2004.01.13;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.018 c
1-37743
alexnmsk
2003-12-30 09:19
2004.01.13
Изменение размера формы


1-37694
serg128
2003-12-25 18:55
2004.01.13
Не отображаются MDI-окна в меню программы


14-37842
Devourer
2003-12-23 15:40
2004.01.13
2 глюка Win98


3-37585
gestern
2003-12-13 18:20
2004.01.13
Надо быстрее.


1-37781
Cash
2003-12-21 14:22
2004.01.13
Параметры в командной строке (*.exe -p1)