![]() |
String filtern
Hallo,
Wie kann ich aus einem String die ersten 10 Zeichen heraufiltern und den Rest löschen? gruss |
Re: String filtern
Copy()
|
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... |
Re: String filtern
Delphi-Quellcode:
damit schneidest du alle zeichen ab dem elften ab. auch wenn das ganze recht sinnlosprogrammiert ist ;)
procedure TForm1.Button1Click(Sender: TObject);
var x:string; begin x:=edit1.Text; delete(x,11,100000); label1.Caption:=x; end; |
Re: String filtern
Oder auch
Delphi-Quellcode:
...:cat:...
SetLength(MeinString, 10);
|
Re: String filtern
Zitat:
Delphi-Quellcode:
Falls wiedererwarten der String länger als 100000 zeichen lang sein sollte^^
delete(x,11,length(x));
|
Re: String filtern
Zitat:
|
Re: String filtern
Ok, habs mit copy() gemacht, funzt super! danke!
|
Re: String filtern
Mit
Delphi-Quellcode:
wird sogar noch eine überflüssige Längenbestimmung vermieden.
Delete (x, 11, MaxInt);
@sakura Ich weiß, ich bin gemein. Aber was ist, wenn der Originalstring wider Erwarten kürzer als 10 Zeichen ist? Gruß Hawkeye |
Re: String filtern
Ich habe schnell folgendes Testprogramm geschrieben:
Delphi-Quellcode:
Dabei zeigt sich sehr deutlich, dass Methode 1 (copy) und Methode 3 (setlength) extrem schnell sind, Methode 2 dagegen unmenschlich langsam.
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. 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. |
Re: String filtern
Sehr interessant auch:
Delphi-Quellcode:
Ich bekomme da ein ''kkmctl32.dll'' raus. Kann das jemand erklären? und wenn man das str:='kk' entfernt, steht ein 'Button1' da.
str:='kk';
setlength(str,50); showmessage(str); |
Re: String filtern
Die Wege des Speichermanagers sind unergründlich...
|
Re: String filtern
Moin Toxman,
Du bekommst halt das, was gerade im Speicher steht, da SetLength den Inhalt nicht initialisiert. |
Re: String filtern
Und warum steht da immer das gleiche? :gruebel:
|
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?
|
Re: String filtern
Zitat:
|
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...
|
Re: String filtern
Aber inwiefern ist die Initialisierung dabei wichtig?
|
Re: String filtern
Wahrscheinlich nimmt der Speichermanager dann nen anderen Speicherblock...
|
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