![]() |
Stringvergleich nicht wie gewünscht
Moin,
mir ist was unklar bzgl. den Vergleichsfunktionen bei Strings. Ich möchte zwei Strings miteinander vergleichen, z.B. zwei mal Edit.Text Nun gibt´s ja verschiedene Möglichkeiten, da ich aber wollte, dass groß/klein interessiert, habe ich comparestring benutzt und nicht etwa comparetext. Nun dachte ich weiterhin, dass diese Funktion tatsächlich auch auf die gleiche Länge achtet. Scheinbar ist das nicht so. Edit1.text := 'Test' und Edit2.text := 'testaaaa' Der Vergleich zwischen den beiden liefert true - warum? Und wie mach ich´s richtig? Muss ich da tatsächlich jedes Zeichen auf Ascii Ebene durchforsten? |
Re: Stringvergleich nicht wie gewünscht
Aehm, CompareStr gibt einen Integer zurück und keinen Boolean! Kuck mal in der OH!
|
Re: Stringvergleich nicht wie gewünscht
Danke, weiß ich.
Sollte eine sinngemäße Erklärung sein. Gibt 0 bei Gleichheit zurück. Stände in der OH die Lösung hät ich hier nicht gefragt. |
Re: Stringvergleich nicht wie gewünscht
warum nicht der einfache weg:
Delphi-Quellcode:
if string1 = string2 then
begin .... end; |
Re: Stringvergleich nicht wie gewünscht
Zitat:
EDIT: ^^ Wie unten beschrieben ist diese Aussage scheinbar falsch. Muss ich wohl selbst nochmal testen. |
Re: Stringvergleich nicht wie gewünscht
Also bei mir kommt bei folgendem Code als ergebnis -32 raus (D7 Enterprise):
Delphi-Quellcode:
Ed1.text := 'Test'; Ed2.text := 'testaaaa'; ShowMessage(IntToStr(CompareStr(ed1.Text, ed2.Text))); |
Re: Stringvergleich nicht wie gewünscht
@dfried
ich gebe zu diesen letzten Test mir Showmessage Gester nicht mehr ausprobiert hab, letzter Test vor´m Abschalten war nur noch unter "reelen" Bedingungen und da hat´s nicht geklappt. Hab vielleicht noch einen anderen Fehler... :shock: Kann´s erst heute Abend wieder testen, aber sag mal, hat er mit -37 evtl. nur die Groß-Kleinscheibung angemeckert? Danke euch! |
Re: Stringvergleich nicht wie gewünscht
Hab mal ein bisserl getestet, so wie's aussieht hört der Vergleich nach dem ersten unterschiedlichen Zeichen auf und gibt die Differenz der beiden Ordinalwerte der Zeichen zurück.
Das würde das Ergebnis -32 erklären T = Ord(84) / t = Ord(116). Wenn beide Strings bis auf die Länge identisch sind (also z.B. Text1 = 'test', Test2 = 'testaaaa') dann kommt als Ergebnis -4 das würde bedeuten, der erste String ist 4 Zeichen kürzer als der zweite. Bei folgendem Beispiel Text1 = 'testb', Test2 = 'testaaaa' kommt als Ergebnis 1 raus, was wiederum der differenz zwischen Ord(b) = 98 und Ord(a) = 97 entsprechen würde. Wenn du's ganz genau wissen möchtest musst du dir den AssemblerCode in der Sysutils.pas anschaun :) Gruß Daniel |
Re: Stringvergleich nicht wie gewünscht
danke dir,
muss mir nochmal anschauen was ich da gemacht hab, irgenwas hatte immer nicht hingehauen. Erst war Groß-Kein egal, lag aber an CompareText, dann klappte das andere nicht. Was ich aber nicht verstehe, denn es müsste ja eigentlich hinhauen - seh ich ja ein! :-D |
Re: Stringvergleich nicht wie gewünscht
Code:
wenn das einer nach delphi uebersetzen kann, viel spass damit. hab ich ausm netz gefischt.
int stricmp(const char *a, const char *b)
{ int res; while (!(res = tolower(*a) - tolower(*b)) && *a++ && *b++); return res; } funktioniert eventuell besser als das vorgefertigte etwas aus der borland-trickkiste. |
Re: Stringvergleich nicht wie gewünscht
Zitat:
|
Re: Stringvergleich nicht wie gewünscht
Ich glaub das ist nich das was er wollte, weil da die Groß-/Kleinschreibung NICHT berücksichtigt wird (tolower)!
edit: Shit RavenIV war schneller :) |
Re: Stringvergleich nicht wie gewünscht
Stringvergleich unter Beachtung der Groß-/Kleinschreibung:
Delphi-Quellcode:
Stringvergleich ohne Beachtung der Groß-/Kleinschreibung:
if S1 = S2 then ...
Delphi-Quellcode:
:wiejetzt: Wo liegt das Problem?
if UpperCase(S1) = UpperCase(S2) then ...
|
Re: Stringvergleich nicht wie gewünscht
Zitat:
|
Re: Stringvergleich nicht wie gewünscht
war mir doch so, dass das "=" auch Gross/Kleinschreibung beachtet :lol: :roll:
als Referenz: ![]() Zitat:
|
Re: Stringvergleich nicht wie gewünscht
@dfried: Kannst du mir mal ein Beispiel zeigen, wie das Gebietsschema einen Stringvergleich beeinflussen kann? Da kann ich mir nix drunter vorstellen :nerd: Und: ist das hier überhaupt wichtig?
|
Re: Stringvergleich nicht wie gewünscht
@Grishnak
Ein konkretes Beispiel kann ich dir leider so spontan auch nicht geben. ABer vielleicht einen Teil aus der OH zum Thema (zu finden bei der Funktion AnsiCompareStr) Zitat:
Ob das hier von Bedeutung ist, muss dir padavan beantworten! Ich bin nur darauf eingegangen weil er in seinem Post selbst schon CompareStr erwähnt hat. :zwinker: |
Re: Stringvergleich nicht wie gewünscht
@dfried: ich dachte, es geht hier darum, zu prüfen ob zwei Strings gleich sind (oder nicht), aber nicht, wie "ungleich" sie sind! Naja, lassen wir den Thread-Ersteller zu Wort kommen...
|
Re: Stringvergleich nicht wie gewünscht
:wink:
Wow, "eure" Diskussion liest sich spannender als Harry Potter. Also danke für das Wort. Ich meinte für meinen Fall das schon so, das zwei Strings auf Gleichheit überprüft werden sollen. Wie ungleich sie sind, wäre mir dann eigentlich egal. Bei einen Passwort ist es ja das gleiche, Groß-Kleinschreibung und die Länge sind da ja auch relevant. Comparestring vergleicht also auf Gleichheit unter allen Gesichtpunkten? (ich kann´s erst heute Abend prüfen, hab auf der Arbeit leider kein Delphi) Dann hätte ich einfach nur einen anderen Fehler gemacht..... |
Re: Stringvergleich nicht wie gewünscht
Wenn ich 'A' und 'B' ('A' = 'B') vergleiche wird intern ja auch der ASCII-Code nämlich 65 und 66 verglichen.
Somit wird auch 'A' und 'a' auf den ASCII-Code "überpürft" nämlich 65 und 97. Ich kann ja auch zu 'A' eins dazu addieren --> 'A' + 1 = 65 + 1 = 66 = 'B'. Ich könnte auch 'A' und 'B' miteinander addieren --> 'A' + 'B' = 65 + 66 = 131 = 'ƒ' Wobei hier der Compiler wegen Typeninkompatiblität meckern sollte (habs in Delphi noch nicht ausprobiert). Also warum sollte es bei längeren Zeichenketten nicht funktionieren? Oder meint ihr es hängt von der verwendeten ASCII-Tabelle ab? Aber in welcher Tabelle würde dann 'A' = 'a' sein :gruebel: |
Re: Stringvergleich nicht wie gewünscht
So habs eben mal ausprobiert.
'A' = 'a' bringt false auch z.B. 'Ampel' und 'ampel' bringt false Also wo ist das Problem? Und das Addieren von Zahlen zu einem Zeichen lässt sich durch
Code:
realisieren.
chr (ord ('A') + 1)
|
Re: Stringvergleich nicht wie gewünscht
Im Moment gar keins,
wie gesagt, hab bestimmt einen anderen Fehler gemacht, aber irrtümlicherweise gedacht, Comparestring funzt nicht wie ich will.... |
Re: Stringvergleich nicht wie gewünscht
@Puhbaer:
Nach Pascal-Syntax liefert 'A'+'B' weder ƒ noch einen Compilerfehler, sondern 'AB'. |
Re: Stringvergleich nicht wie gewünscht
Stimmt stimmt hast recht.
Aber dafür bringt chr (ord ('A') + ord ('B')) das gewünschte Ergebnis :) Sorry für den kleinen Fehler ;) |
Re: Stringvergleich nicht wie gewünscht
wenn mein code schnippsel nicht das macht, was ihr wollt, dann schreibt ihn eben um.
waers nicht einfacher, mal eben so eine funktion zu schreiben? |
Re: Stringvergleich nicht wie gewünscht
sagt mal,
das sollte doch funktionieren oder:
Delphi-Quellcode:
Aber wenn ich das so mache, dann wird zwar auf Groß und klein geachtet, aber mein ursprüngliches Problem bleibt,
if comparestr(Edit1.text,'irgenwas') = 0 then begin
//tu was end; und die Bedingung ist trotzdem erfüllt, auch wenn ich nochwas an 'irgendwas' dranhänge. Z.B. 'irgendwasaaa'. Ich will aber doch nur das die Bedingung erfüllt ist, wenn die String Haargenau identisch sind. :cry: Lasse ich es mir so anzeigen,
Delphi-Quellcode:
dann geht´s, dann bekomme ich die Differenz zu 0
label1.caption := inttostr(comparestr(Edit1.text,'irgendwas'));
Ich versteh gar nix :wiejetzt: |
Re: Stringvergleich nicht wie gewünscht
meine guete, werd ich hier absichtlich ueberlesen?!?
schreib dir so eine funktion, wenn du keine passende findest! und wenn du willst, schreib ich dir sogar persoenlich eine. nur muss ich mir vorher erstmal einen pascal compiler installieren... //edit: hast du ein glueck, dass ich ne version vom gnu pascal compiler irgendwann mal installiert hab... kriegst deine funktion gleich |
Re: Stringvergleich nicht wie gewünscht
Moment, bevor du dir Mühe machst.
Was denn für eine Funktion? Erklär mir lieber, warum sich comparestr nicht das tut was ich will :) Andererseits bin ich echt gespannt was du vorhast.... |
Re: Stringvergleich nicht wie gewünscht
ich hab keine ahnung, wieso comparestring sich so verhaelt, wie du es berichtest.
entweder liefert die funktion nicht das verhalten, das du brauchst, oder du interpretierst die rueckgabewerte falsch. ich wuerde eine funktion schreiben, die nur fuer byteidentische strings 0 zurueckgibt. fuer alle anderen faelle wird die bytedifferenz der ersten ungleichen zeichen zurueckgegeben. bei ungleichlangen strings wird eventuell die differenz des ersten ueberlangen zeichens zum null-zeichen zurueckgegeben. damit verhaelt sich die funktion, die ich schreiben wuerde, nahezu identisch zum C aequivalent strcmp(). einziger unterschied: strcmp() returnt nur -1, 0 oder 1 waehrend ich auch <-1 und >1 zurueckgeben wuerde. uebrigens: "stringa = stringb" tut genau was du willst. gross/kleinschreibung wird beachtet und auch die laenge.
Delphi-Quellcode:
function strcmp(a, b: string): integer;
{ strcmp(foo,foo) = 0 strcmp(FOO,foo) = -32 strcmp(foo,faa) = 14 strcmp(faa,foo) = -14 strcmp(foox,foo) = 120 strcmp(foo,foox) = -120 } var i: integer; c,d: byte; begin result := 0; i := 1; repeat if a[i] <> b[i] then begin result := ord(a[i]) - ord(b[i]); end; inc(i); until (i > length(a)) or (i > length(b)); if length(a) > length(b) then result := ord(a[length(b)+1]) else if length(a) < length(b) then result := -ord(b[length(a)+1]); { ANSI C behaviour compatibility: } { result := byte(result > 0) - byte(result < 0); } end; |
Re: Stringvergleich nicht wie gewünscht
Hallo Leute,
wie kann man nur so aneinander vorbei schreiben... Die klassische Identität zweier Zeichenketten wird durch den Operator = ermittelt. Dabei werden intern die code values der einzelnen Zeichen paarweise verglichen und bei Abweichung oder Längenunterschied abgebrochen. Dieser primitive Test wird von CompareStr() nachvollzogen. Die Funktion existiert eigentlich nur, weil sie oft als compare function für quick sort und binary search benötigt wird. Wenn ich nur einen simplen identity check brauche, dann verwende ich den intern überladenen Gleichheits-Operator "=". Bei anderen Anforderungen muss man genauer schauen. Freundliche Grüße vom marabu |
Re: Stringvergleich nicht wie gewünscht
Ich kann mich nur wiederholen, der folgende Code liefert bei mir eindeutig, dass die Strings nicht gleich sind!
Delphi-Quellcode:
begin
ed1.Text := 'irgendwasaaa'; if CompareStr(ed1.Text, 'irgendwas') = 0 then ShowMessage('Strings sind gleich') else ShowMessage('Strings sind NICHT gleich'); end; |
Re: Stringvergleich nicht wie gewünscht
auch mal zur Wiederholung:
Zitat:
|
Re: Stringvergleich nicht wie gewünscht
weil der OP scheinbar woanders fehler hat, die er dem stringvergleich zuschreibt?
|
Re: Stringvergleich nicht wie gewünscht
wahrscheinlich (kann nur so sein) ist es so wie ripper8472 sagt.
--> Hab ein anderes Problem und mich verrannt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 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-2025 by Thomas Breitkreuz