wxStrcmp gibt falsche Werte zurück



  • Hallo zusammen,

    ich frage ein Feld aus einer Datenbank ab, welches die Strings "Dauerauftrag" oder "Einzugsermaechtigung" beinhalten kann.
    Nun möchte ich abfragen, welchen von beiden Strings dieses Feld enthält:

    std::cout << "Zahlungsart (Rueckgabe aus DB): " << db_zahlungsart.mb_str() << std::endl;
    std::cout << "Dauerauftrag (TRUE/FALSE): " << wxStrcmp(db_zahlungsart, wxT("Dauerauftrag")) << std::endl;
    std::cout << "Einzug (TRUE/FALSE): " << wxStrcmp(db_zahlungsart, wxT("Einzugsermaechtigung")) << std::endl;
    

    Zu Testzwecken habe ich mir das Ergebnis (beide Rückgabewerte) mal auf STDOUT ausgeben lassen.
    Die stimmen aber vorne und hinten nicht:
    Prüfe ich auf den String "Dauerauftrag", bekomme ich 0 zurück und für den nicht geprüften String "Einzugsermaechtigung" -1:

    Zahlungsart (Rueckgabe aus DB): Dauerauftrag
    Dauerauftrag (TRUE/FALSE): 0
    Einzug (TRUE/FALSE): -1
    

    Prüfe ich dagegen auf den String "Einzugsermaechtigung", bekomme ich dafür 0 zurück und für den nicht geprüften String "Dauerauftrag" 1:

    Zahlungsart (Rueckgabe aus DB): Einzugsermaechtigung
    Dauerauftrag (TRUE/FALSE): 1
    Einzug (TRUE/FALSE): 0
    

    Da aber beide Strings exakt so in der DB vorliegen (und scheinbar auch so zurückgeliefert werden), sollte im Fall eines Treffers doch 1 und ansonsten 0 zurückgeliefert werden?

    Kann mir jemand sagen, was hier falsch läuft?
    Danke!



  • Dieses Verhalten wirst du häufig bei "compare"-Funktionen finden. Bei Gleichheit wird eine 0 zurückgeliefert und bei Ungleichheit ein positiver/negativer Wert um entscheiden zu können ob der aktuelle Wert im Bezug zum Vergleichswert größer oder kleiner ist.
    Bei strcmp (und vermutlich auch wxStrcmp) entspricht der Wert der Differenz des ersten unterscheidenden Ascii zeichen, also hier 'E' und 'D' -> daher +-1.
    Vorteil der ganzen Sache ist, dass du damit z.B. gut sortieren kannst (bspw. mit qsort() aus der cstdlib).
    Mit der wxString Klasse kannst du aber auch mit == und != auf Gleich/Ungleichheit des Inhalts testen.



  • Wie aa bereits sagte, warum verwendest Du nicht den ==-operator von wxString?
    Ansonsten:

    int wxStrcmp(const char *p1, const char *p2)

    Returns a negative value, 0, or positive value if p1 is less than, equal to or greater than p2. The comparison is case-sensitive.

    This function complements the standard C function stricmp() which performs case-insensitive comparison.

    http://biolpc22.york.ac.uk/wx/docs/html/wx/wx_stringfunctions.html#wxstrcmp
    rya.



  • Ich bin eigentlich davon ausgegangen, dass wxStrcmp die "galantere" Variante gewesen wäre.
    Aber das Einfache liegt oft doch so nah... 😉

    Mit

    [...] db_zahlungsart == wxT("Dauerauftrag") [...]
    

    klappt's wunderbar!

    Besten Dank Euch beiden!

    Gruß,
    /T


Anmelden zum Antworten