Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String filtern (https://www.delphipraxis.net/73634-string-filtern.html)

zebrafalke 20. Jul 2006 21:44


String filtern
 
Hallo,

Wie kann ich aus einem String die ersten 10 Zeichen heraufiltern und den Rest löschen?

gruss

mkinzler 20. Jul 2006 21:48

Re: String filtern
 
Copy()

ferby 20. Jul 2006 21:49

Re: String filtern
 
Hallo


Delphi-Quellcode:
irgendeinstring: string;


irgendeinstring:='fsdfhgdasfjgkhtrsdhjf';


irgendeinstring:=copy(irgendeinstring,1,10);

Ist nicht getestet, müsste aber gehen.

Falls nicht, schau dir einfach die Copy funktion an, bzw. es gibt auch eine Delete Funktion, die dir helfen dürfte...

Noobinator 21. Jul 2006 15:43

Re: String filtern
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x:string;
begin
x:=edit1.Text;
delete(x,11,100000);
label1.Caption:=x;
end;
damit schneidest du alle zeichen ab dem elften ab. auch wenn das ganze recht sinnlosprogrammiert ist ;)

sakura 21. Jul 2006 15:47

Re: String filtern
 
Oder auch
Delphi-Quellcode:
SetLength(MeinString, 10);
...:cat:...

inherited 21. Jul 2006 15:56

Re: String filtern
 
Zitat:

Zitat von Noobinator
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x:string;
begin
x:=edit1.Text;
delete(x,11,100000);
label1.Caption:=x;
end;
damit schneidest du alle zeichen ab dem elften ab. auch wenn das ganze recht sinnlosprogrammiert ist ;)

Doch besser
Delphi-Quellcode:
delete(x,11,length(x));
Falls wiedererwarten der String länger als 100000 zeichen lang sein sollte^^

Noobinator 21. Jul 2006 16:05

Re: String filtern
 
Zitat:

Zitat von inherited
Zitat:

Zitat von Noobinator
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x:string;
begin
x:=edit1.Text;
delete(x,11,100000);
label1.Caption:=x;
end;
damit schneidest du alle zeichen ab dem elften ab. auch wenn das ganze recht sinnlosprogrammiert ist ;)

Doch besser
Delphi-Quellcode:
delete(x,11,length(x));
Falls wiedererwarten der String länger als 100000 zeichen lang sein sollte^^

genau dieser ausdruck mit dem length ist mir nicht eingefallen^^

zebrafalke 21. Jul 2006 16:19

Re: String filtern
 
Ok, habs mit copy() gemacht, funzt super! danke!

Hawkeye219 21. Jul 2006 16:20

Re: String filtern
 
Mit
Delphi-Quellcode:
Delete (x, 11, MaxInt);
wird sogar noch eine überflüssige Längenbestimmung vermieden.

@sakura
Ich weiß, ich bin gemein. Aber was ist, wenn der Originalstring wider Erwarten kürzer als 10 Zeichen ist?

Gruß Hawkeye

3_of_8 21. Jul 2006 16:23

Re: String filtern
 
Ich habe schnell folgendes Testprogramm geschrieben:

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}
{$O-}

uses
  Windows, SysUtils;

var I, start, time1, time2, time3: Cardinal;
      str, str2: String;
begin
setlength(str, 100000);
Randomize;
for I:=1 to 100000 do str[I]:=Chr(65+Random(26));

start:=GetTickCount;
for I:=1 to 100000 do
begin
str2:=str;
str2:=copy(str2, 1, 10);
end;
time1:=GetTickCount-start;

start:=GetTickCount;
for I:=1 to 100000 do
begin
str2:=str;
delete(str2, 11, length(str2));
end;
time2:=GetTickCount-start;

start:=GetTickCount;
for I:=1 to 100000 do
begin
str2:=str;
setlength(str2, 10);
end;
time3:=GetTickCount-start;

writeln(inttostr(time1)+#13#10+inttostr(time2)+#13#10+inttostr(time3));
readln;
end.
Dabei zeigt sich sehr deutlich, dass Methode 1 (copy) und Methode 3 (setlength) extrem schnell sind, Methode 2 dagegen unmenschlich langsam.

Hier die genauen Ergebnisse (Mehrmals gemessen, dann Durchschnitt gebildet):
Methode 1 (copy): 111 ms
Methode 2 (delete): 21691 ms
Methode 3 (setlength): 40 ms

Die Messwerte gelten für jeweils 100000 mal die ersten 10 Zeichen eines 100000 Zeichen Strings extrahieren.

Man sieht, dass setlength am schnellsten ist.

EDIT: Wenn der String kleiner als 10 Zeichen ist, passiert etwas sehr seltsames.
Der String wird mit #0en aufgefüllt, nur die letzten 2 Zeichen sind dan noch #77 und #83, werden allerdings mit showmessage, das ich zum Testen verwendet habe nicht angezeigt, klar, da die erste #0 als Ende des Strings gewertet wird bei der Übergabe als PChar.

Nikolas 21. Jul 2006 16:29

Re: String filtern
 
Sehr interessant auch:
Delphi-Quellcode:
str:='kk';
setlength(str,50);
showmessage(str);
Ich bekomme da ein ''kkmctl32.dll'' raus. Kann das jemand erklären? und wenn man das str:='kk' entfernt, steht ein 'Button1' da.

3_of_8 21. Jul 2006 16:34

Re: String filtern
 
Die Wege des Speichermanagers sind unergründlich...

Christian Seehase 21. Jul 2006 16:34

Re: String filtern
 
Moin Toxman,

Du bekommst halt das, was gerade im Speicher steht, da SetLength den Inhalt nicht initialisiert.

3_of_8 21. Jul 2006 16:38

Re: String filtern
 
Und warum steht da immer das gleiche? :gruebel:

Nikolas 21. Jul 2006 16:44

Re: String filtern
 
Da kann ich mich Manuel nur anschließen. Den Code hatte ich in einem einsamen Button auf einem Form geschrieben und seinen Namen nicht verändert. Wenn also 'Button1' rauskommt, müsste der Speicherplatz für den String in/vor dem Speicherplatz der exe sein. Nur wenn dann die Variable initialisiert wird, steht sie plötzlich nicht mehr von der Caption des Button, sondern anscheinend woanders. Weiss denn jemand spontan, was die mctl32.dll macht?

Khabarakh 21. Jul 2006 17:01

Re: String filtern
 
Zitat:

Zitat von 3_of_8
Und warum steht da immer das gleiche? :gruebel:

Warum nicht :gruebel: ? Solange du keine großen Änderungen vornimmst, bleiben die Speicheradressen natürlich gleich.

3_of_8 21. Jul 2006 17:03

Re: String filtern
 
Also ich hätte jetzt gedacht, dass so etwas zur Laufzeit festgelegt wird und daher von vielen anderen Sachen abhängt: Andere laufende Prozesse usw...

Nikolas 21. Jul 2006 17:07

Re: String filtern
 
Aber inwiefern ist die Initialisierung dabei wichtig?

3_of_8 21. Jul 2006 17:09

Re: String filtern
 
Wahrscheinlich nimmt der Speichermanager dann nen anderen Speicherblock...

Der_Unwissende 21. Jul 2006 17:21

Re: String filtern
 
Hi,
wo genau der Speicher angelegt wird hängt auch von einer ganze Menge verschiedener Dinge ab. Es wird sicherlich bevorzugte Bereiche geben, aber letztlich können auch die schon belegt sein (z.B. zwei Instanzen des gleichen Programms).
Da gibt es auch ein paar aktuelle Techniken, die glaube ich gerade versuchen den Speicher mal etwas zu zerwürfeln, da diese momentane Vorhersagbarkeit wo was landet die Schwachstelle ist, die für Überläufe (bzw. die resultierenden Attacken) ausgenutzt wird.

Gruß Der Unwissende


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz