Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stringvergleich nicht wie gewünscht (https://www.delphipraxis.net/54532-stringvergleich-nicht-wie-gewuenscht.html)

padavan 6. Okt 2005 07:07


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?

dfried 6. Okt 2005 07:13

Re: Stringvergleich nicht wie gewünscht
 
Aehm, CompareStr gibt einen Integer zurück und keinen Boolean! Kuck mal in der OH!

padavan 6. Okt 2005 07:23

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.

RavenIV 6. Okt 2005 07:26

Re: Stringvergleich nicht wie gewünscht
 
warum nicht der einfache weg:
Delphi-Quellcode:
if string1 = string2 then
begin
  ....
end;

KLS 6. Okt 2005 07:28

Re: Stringvergleich nicht wie gewünscht
 
Zitat:

Zitat von RavenIV
warum nicht der einfache weg:
Delphi-Quellcode:
if string1 = string2 then
begin
  ....
end;

Das beachtet die Gross-/Kleinschreibung nicht.

EDIT: ^^ Wie unten beschrieben ist diese Aussage scheinbar falsch. Muss ich wohl selbst nochmal testen.

dfried 6. Okt 2005 07:30

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)));

padavan 6. Okt 2005 07:39

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!

dfried 6. Okt 2005 08:02

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

padavan 6. Okt 2005 08:11

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

ripper8472 6. Okt 2005 08:27

Re: Stringvergleich nicht wie gewünscht
 
Code:
int stricmp(const char *a, const char *b)
{
    int res;
    while (!(res = tolower(*a) - tolower(*b)) && *a++ && *b++);
    return res;
}
wenn das einer nach delphi uebersetzen kann, viel spass damit. hab ich ausm netz gefischt.
funktioniert eventuell besser als das vorgefertigte etwas aus der borland-trickkiste.

RavenIV 6. Okt 2005 08:37

Re: Stringvergleich nicht wie gewünscht
 
Zitat:

Zitat von ripper8472
wenn das einer nach delphi uebersetzen kann, viel spass damit. hab ich ausm netz gefischt.
funktioniert eventuell besser als das vorgefertigte etwas aus der borland-trickkiste.

das wird ihn nicht begeistern, weil er sich ja auch für Gross/Kleinschreibung interessiert...

dfried 6. Okt 2005 08:38

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 :)

Grishnak 6. Okt 2005 08:41

Re: Stringvergleich nicht wie gewünscht
 
Stringvergleich unter Beachtung der Groß-/Kleinschreibung:

Delphi-Quellcode:
if S1 = S2 then ...
Stringvergleich ohne Beachtung der Groß-/Kleinschreibung:

Delphi-Quellcode:
if UpperCase(S1) = UpperCase(S2) then ...
:wiejetzt: Wo liegt das Problem?

dfried 6. Okt 2005 08:50

Re: Stringvergleich nicht wie gewünscht
 
Zitat:

Zitat von Grishnak
Wo liegt das Problem?

Das Problem liegt darin, dass dein aufgezeigter Vergleich abhängig vom eingestellten Gebietsschema ist, CompareStr aber "wird vom aktuellen Gebietsschema nicht beeinflusst" (Zitat aus der OH).

RavenIV 6. Okt 2005 08:53

Re: Stringvergleich nicht wie gewünscht
 
war mir doch so, dass das "=" auch Gross/Kleinschreibung beachtet :lol: :roll:
als Referenz: Delphi-Referenz -> im unteren Drittel:
Zitat:

Das Vergleichen von zwei Strings erfolgt mit dem Gleichheitszeichen. Dabei wird Groß- und Kleinschreibung beachtet.

Grishnak 6. Okt 2005 09:28

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?

dfried 6. Okt 2005 09:38

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:

Hinweis: Bei den meisten Gebietsschemas haben Kleinbuchstaben einen kleineren Wert als die entsprechenden Großbuchstaben. Dies widerspricht der ASCII-Sortierfolge, in der Kleinbuchstaben einen größeren Wert haben. Wenn Sie S1 auf 'a' und S2 auf 'A' setzen, gibt AnsiCompareStr daher einen Wert kleiner als Null zurück, während CompareStr mit denselben Argumenten einen Wert größer als Null liefert.
Borland hat warscheinlich nicht ohne Grund die Funktion CompareStr und AnsiCompareStr geschaffen :)

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:

Grishnak 6. Okt 2005 09:45

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...

padavan 6. Okt 2005 12:12

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.....

Puhbaehr 6. Okt 2005 12:35

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:

Puhbaehr 6. Okt 2005 12:41

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:
chr (ord ('A') + 1)
realisieren.

padavan 6. Okt 2005 13:02

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....

tigerman33 6. Okt 2005 16:59

Re: Stringvergleich nicht wie gewünscht
 
@Puhbaer:
Nach Pascal-Syntax liefert 'A'+'B' weder ƒ noch einen Compilerfehler, sondern 'AB'.

Puhbaehr 6. Okt 2005 22:19

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 ;)

ripper8472 6. Okt 2005 23:16

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?

padavan 7. Okt 2005 05:26

Re: Stringvergleich nicht wie gewünscht
 
sagt mal,

das sollte doch funktionieren oder:

Delphi-Quellcode:
if comparestr(Edit1.text,'irgenwas') = 0 then begin
//tu was
end;
Aber wenn ich das so mache, dann wird zwar auf Groß und klein geachtet, aber mein ursprüngliches Problem bleibt,
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:
label1.caption := inttostr(comparestr(Edit1.text,'irgendwas'));
dann geht´s, dann bekomme ich die Differenz zu 0

Ich versteh gar nix
:wiejetzt:

ripper8472 7. Okt 2005 06:08

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

padavan 7. Okt 2005 06:20

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....

ripper8472 7. Okt 2005 06:37

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;

marabu 7. Okt 2005 06:54

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

dfried 7. Okt 2005 07:20

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;

Grishnak 7. Okt 2005 07:57

Re: Stringvergleich nicht wie gewünscht
 
auch mal zur Wiederholung:

Zitat:

Zitat von Grishnak
Stringvergleich unter Beachtung der Groß-/Kleinschreibung:

Delphi-Quellcode:
if S1 = S2 then ...

Stringvergleich ohne Beachtung der Groß-/Kleinschreibung:

Delphi-Quellcode:
if UpperCase(S1) = UpperCase(S2) then ...
oder
Delphi-Quellcode:
if LowerCase(S1) = LowerCase(S2) then ...

Warum denn unnötig verkomplizieren?

ripper8472 7. Okt 2005 08:05

Re: Stringvergleich nicht wie gewünscht
 
weil der OP scheinbar woanders fehler hat, die er dem stringvergleich zuschreibt?

padavan 7. Okt 2005 08:29

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 00:42 Uhr.

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