Главная страница
    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.57 MB
Время: 0.01 c
14-37859
Спрашивающий_
2003-12-22 01:29
2004.01.13
Поздравляю всех энергетиков с профессиональным праздником


1-37769
АМБ
2003-12-29 16:22
2004.01.13
TSimpleDataSet


9-37491
Mihey
2003-06-26 00:04
2004.01.13
Нужен collision check


14-37870
Undert
2003-12-22 17:46
2004.01.13
Приемущества и недостатки домена


1-37749
Titeha
2003-12-30 08:20
2004.01.13
Изменения в TComboBox и TDateTimePicker





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский