Текущий архив: 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.57 MB
Время: 0.01 c