Komisches strcmp Verhalten



  • Gibt keinen Fehler aus:

    unsigned char A[]="\x8B\xFF\x55\x8B\xEC\x83\x7D\x08\x00\x53\x56";
    unsigned char B[]="\x8B\xFF\x55\x8B\xEC\x83\x7D\x08\x00\x53\x56";
    
    if( strcmp(A,B) != 0 )
    {
       cout<<"err";
    }
    

    Gibt keine Fehler aus: WARUM nicht 😕 (Bei B sind die letzten 2 Bytes anders.

    unsigned char A[]="\x8B\xFF\x55\x8B\xEC\x83\x7D\x08\x00\x53\x56";
    unsigned char B[]="\x8B\xFF\x55\x8B\xEC\x83\x7D\x08\x00\x53\xAA";
    
    if( strcmp(A,B) != 0 )
    {
       cout<<"err";
    }
    

    Gibt einen Fehler aus: ( 0 Byte wurde duch AA ersetzt )

    unsigned char A[]="\x8B\xFF\x55\x8B\xEC\x83\x7D\x08\x00\x53\x56";
    unsigned char B[]="\x8B\xFF\x55\x8B\xEC\x83\x7D\x08\xAA\x53\xAA";
    
    if( strcmp(A,B) != 0 )
    {
       cout<<"err";
    }
    

    WASN DA LOS?! 😡



  • Schau dir mal an was der Rückgabewert von strcmp() genau ist...



  • strcmp kennt die Länge des Strings ja nicht. Deshalb nimmt es an, dass ein 0-Byte das Ende des Strings anzeigt (weil das in C so üblich ist).

    Was du willst ist memcmp.



  • Shade Of Mine schrieb:

    strcmp kennt die Länge des Strings ja nicht. Deshalb nimmt es an, dass ein 0-Byte das Ende des Strings anzeigt (weil das in C so üblich ist).

    Was du willst ist memcmp.

    Wie Shade bereits schrieb, reagieren strcmp und strncmp auf die Nullterminierung '\0', d.h. sobald diese erreicht ist, wird der Vergleichsvorgang abgebrochen.

    Die entsprechende Lösung hat Shade ja ebenfalls bereits vorgeschlagen. Der geneigte C-Hasser macht es natürlich mit einer Schleife und nicht mit solchem Teufelswerk wie memcmp 😃



  • It0101 schrieb:

    Der geneigte C-Hasser macht es natürlich mit einer Schleife und nicht mit solchem Teufelswerk wie memcmp 😃

    Nein, er benutzt C++11:

    array<unsigned char,12> A = { "\x8B\xFF\x55\x8B\xEC\x83\x7D\x08\x00\x53\x56" };
    array<unsigned char,12> B = { "\x8B\xFF\x55\x8B\xEC\x83\x7D\x08\x00\x53\xAA" };
    
    if( A != B )
    {
      cout<<"err";
    }
    


  • Ja, das 0 Byte lol wieso hab ich das so ignorier. -.-

    Naja^^ Danke



  • ...



  • Swordfish schrieb:

    ... kann bis 11 zählen und benutzt uniform initialidingsti:

    wenn er nicht gerade mit VS2012 arbeiten muss 😃



  • STRCMP_FTL schrieb:

    Ja, das 0 Byte lol wieso hab ich das so ignorier. -.-

    Naja^^ Danke

    Generell sollte man, wenn man, gerade im Binärdaten-Business, damit rechnen muss, dass überraschende 0-Bytes auftauchen, lieber von den String-Funktion auf die Mem-Funktionen umsteigen. 😃

    Aber gräme dich nicht... in die \0-Falle bin ich auch schon getappt, besonders wenn man der Meinung ist, dass strncmp garantiert N Zeichen vergleicht und sich dann hinterher davon überzeugen darf, dass dem nicht so ist 😉



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Gerade jetzt, wo hier mit STL-Arrays und Initialisierungslisten nur so herumgeschossen wird, verschiebt ihr das in die C-Ecke 😃



  • ...



  • Das kann ich auf jeden Fall befürworten 😃

    Das ist dann der Ort auf Erden wo man mit memset auf Vectoren losgehen darf 😃


  • Mod

    It0101 schrieb:

    Gerade jetzt, wo hier mit STL-Arrays und Initialisierungslisten nur so herumgeschossen wird, verschiebt ihr das in die C-Ecke 😃

    Ich brauche eben meinen Schönheitsschlaf. Wenn in der Zwischenzeit ein C-Thread im C++-Forum schon C++'isiert wurde, kann ich auch nix mehr retten 🙂 .


Anmelden zum Antworten