Probleme beim String-Vergleich (war: Wo ist hier der Fehler!!)



  • Ich wollt mir ne Funktion schreiben, mit der ich zwei Strings haargenau vergleichen kann.

    Beim Aufruf dieser Funktion kommt immer ein Fehler ich würde eine Bereich überlaufen (ERangeError). Sieht von euch jemand den Fehler?

    bool HardCompare(AnsiString &a,AnsiString &b)
    {
    	a.Trim();
    	b.Trim();
    	if (a.Length()!=b.Length()) {return false;}
    	else
    	{
    		for (int i=0;i<a.Length();i++) {if (a[i]!=b[i]) {return false;};};
    	};
    	return true;
    }
    

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!



  • Du hast hinter deiner else-Klammer ein ';' hingeschrieben.

    Ist das so zulässig?



  • Der Fehler dürfte sein, daß AnsiStrings nicht ab 0, sondern ab 1 indiziert werden.

    Nur so nebenbei, es gibt da die Funktion "bool operator == (const AnsiString&, const AnsiString&)", die genau das macht, was du willst 😉

    Edit: @Tobi3000: ja, ist es. Du kannst im Code so viele Semikola setzen, wie du willst - sind dann eben leere Anweisungen.



  • Hm hab ich auch versucht so zu machen, bloß als ich zB "km" mit "m" verglichen habe, hat der true zurückgegeben hmm. na ich schau nochmal nach. Danke schonmal



  • Jetzt hab ich das Problem gefunden, wenn ich "mm" mit "m" vergleiche wird true zurückgeben, ist das immer so, und kann ich das umgehen???



  • Hallo

    Bei mm und m ist doch aber die Länge unterschiedlich.

    chrische



  • nein ich meinte, wenn ich mit dem Operator von AnsiString vergleiche sprich:

    AnsiString a="mm";
    AnsiString b="m";
    
    ->> (a==b) ist true
    

    ist das immer so?



  • ??
    Bei mir macht er das nicht. Zeig mal den Kontext, in dem das auftreten soll.



  • Also folgendes Problem:

    Ich habe eine String mit Wert und Einheit, und den will ich zerlegen, und die Einheit herausbekommen.

    valuestr ist der String mit Wert und Einheit
    unitstrs ist ein Vector mit den einzelnen Einheiten die möglich sind

    int unitstart=valuestr.Length();
    while ((unitstart>0)&&((valuestr[unitstart]<48)||(valuestr[unitstart]>57)))unitstart--;
    
    valueunit=valuestr.SubString((unitstart+1),valuestr.Length()-unitstart);
    valuestr=valuestr.SubString(1,unitstart);
    for(int i=(unitstrs.size()-1);i>=0;i--)
    {
       if (valueunit==unitstrs[i]) {unit=i;break;}; //hier hunzt irgendwas 
    };
    value=StrToFloatDef(valuestr,badvalues[0],formatsettings);
    


  • Hab den Fehler gefunden, und da es sich gehört, auch die Lösung hinzuschreiben:

    in der Zeile

    if (valueunit==unitstrs[i]) {unit=i;break;};
    

    muss ein Trim() hin, ansonsten hat man unerwünschte Leerzeichen, die den Vergleich unmöglich machen. Also:

    if (valueunit.Trim()==unitstrs[i]) {unit=i;break;};
    

    Danke!


Anmelden zum Antworten