Anfängerfrage zu strcmp



  • Hallo,

    mir stellt sich gerade eine Frage. Ich habe folgendes simple Beispiel:

    #include <stdlib.h>
    
    int main() {
    	  char a = 'a';
    	  char a2 = 'a';
    
    	  char b[] = "b";
    	  char b2[] = "b";
    
    	  printf("result a: %i \n", strcmp(&a, &a2));
    	  printf("result b: %i \n", strcmp(b, b2));
    
    }
    

    Ausgabe:
    result a: -1
    result b: 0

    Wieso funktioniert strcmp für Fall a nicht? Ich gebe die Pointer für zwei chars weiter, die lexikographisch gleich sind. Sollte doch auch eine 0 als result rauskommen, oder? (Hinzufügen eines Nullbytes führt zu demselben Ergebnis).

    Viele Dank und Gruß
    Seba



  • strcmp vergleicht zwei Strings bis zu ihrer Null-Terminierung '\0'.
    In deinem Fall gibt es aber keine, weil du keinen Null-terminierten String verwendest sondern nur ein einziges Zeichen. Der Speicher dahinter ist mutmaßlich mit irgendetwas belegt, aber befindet sich eigentlich nicht in deiner Hand.

    Kurz gesagt: Das ist ziemlich übel was du hier treibst 😉

    Für strcmp nimmt man nur nullterminierte Character-Arrays ( char *, const char * )!



  • Seba08 schrieb:

    Hinzufügen eines Nullbytes führt zu demselben Ergebnis.

    Mich würde mal interessieren, wie du deinem "char a" eine 0 hinzugefügt hast, denn da passt doch nur ein Zeichen rein 😉



  • char a = 0;
    char a2 = 0;
    int res = strcmp( &a, &a2 );
    

    Das funktioniert bei mir. Erwartungsgemäß.



  • It0101 schrieb:

    Seba08 schrieb:

    Hinzufügen eines Nullbytes führt zu demselben Ergebnis.

    Mich würde mal interessieren, wie du deinem "char a" eine 0 hinzugefügt hast, denn da passt doch nur ein Zeichen rein 😉

    Naja zimelich blöde halt:

    char a = 'a' + 0;
    

    Der Kompiler meckert das nicht an, aber nutzen tuts nix^^. Blutige Anfängerfehler eines blutigen Anfängers halt :).

    Nehmen wir mal an, ich möchte eine Methode, die strcmp nutzt für eine Bibliothek schreiben. Übergabeparameter sind 2 variablen einer struct, die einen Pointer auf diese char enthalten. Wie stelle ich sicher, dass der Nutzer dieser lib nicht denselben Fehler macht wie ich beim erstellen des chars? Die Methode würde arbeiten, alles würde kompilieren, aber es kommt nur Blödsinn dabei heraus.


  • Mod

    Seba08 schrieb:

    Naja zimelich blöde halt:

    char a = 'a' + 0;
    

    Das ist wie 1 + 0 = 10 .

    Seba08 schrieb:

    Nehmen wir mal an, ich möchte eine Methode, die strcmp nutzt für eine Bibliothek schreiben. Übergabeparameter sind 2 variablen einer struct, die einen Pointer auf diese char enthalten. Wie stelle ich sicher, dass der Nutzer dieser lib nicht denselben Fehler macht wie ich beim erstellen des chars? Die Methode würde arbeiten, alles würde kompilieren, aber es kommt nur Blödsinn dabei heraus.

    Gar nichts tust du dagegen. Wenn der Nutzer sich nicht an das vereinbarte Interface hält, dann ist er selber schuld. Da es (in C) prinzipiell nicht möglich ist, diese Art von Fehler im Voraus festzustellen, würde ich mir auch nicht weiter den Kopf darüber zerbrechen.



  • Naja zimelich blöde halt:

    char a = 'a' + 0;
    

    Das ist lediglich eine Ganzzahladdition.
    Hier wird lediglich Null zum ASCII Code des 'a' addiert.
    Die Null wird nicht hinten angehängt.
    Außerdem passt in einen char genau ein Zeichen.
    Um ein "a" mit einer Null abschließen zu können, braucht man aber zwei Zeichen.
    Eins für das "a" und eins für die Null.

    char a[] = "a"; // Hier fügt der Compiler die Null ein.
    

    Im RAM sieht das dann quasi so aus: "a\0"

    Seba08 schrieb:

    Wie stelle ich sicher, dass der Nutzer dieser lib nicht denselben Fehler macht wie ich beim erstellen des chars?

    Das ist als wennze Hersteller von Brotmessern bist und sicherstellen willst, dass die Benutzer sich damit nicht in den Finger schneiden.
    - Geht also auch nicht -



  • Danke an euch. 🙂


Log in to reply