Problem mit printf



  • Hallo weiss wer wie ich die Programm Ausgabe so hinbekommen kann das da steht:
    c0 0

    Also eigentlich soll nur das hier raus: ffffff

    Wenn ich schreibe char *s = "A"; dann wird Ausgeben 41 0 aber bei dem À
    da wird immer das ffffff davor gesetzt.

    Gibt es irgendeinen Ausgabe Parameter der nur die ersten 2 Zeichen ausgibt ?

    char *s="À";
    for (int i=0;i<=strlen(s);i++)
    {
            printf("%x " , s[i] ) ;
    }
    

    Programm Ausgabe:

    ffffffc0 0



  • printer schrieb:

    Hallo weiss wer wie ich die Programm Ausgabe so hinbekommen kann das da steht:
    c0 0

    Also eigentlich soll nur das hier raus: ffffff

    Wenn ich schreibe char *s = "A"; dann wird Ausgeben 41 0 aber bei dem À
    da wird immer das ffffff davor gesetzt.

    Gibt es irgendeinen Ausgabe Parameter der nur die ersten 2 Zeichen ausgibt ?

    char *s="À";
    for (int i=0;i<=strlen(s);i++)
    {
            printf("%x " , s[i] ) ;
    }
    

    Programm Ausgabe:

    ffffffc0 0

    %x erwartet einen integer Du übergibst aber ein char. Bin mir jetzt allerdings nicht sicher, ob das nicht automatisch erweitert wird. Auf jeden Fall hast Du aber ein Problem, daß Du signed chars benutzt. So ist's richtig:

    unsigned char *s="À";
    for (int i=0;i<=strlen(s);i++)
    {
            printf("%x " , (unsigned int)s[i] ) ;
    }
    

    Ob der cast beim Aufruf von printf erforderlich ist, weiß ich jetzt aber leider nicht genau.

    mfg Martin



  • Dein angegebenes Zeichen hat dezimal den Wert 192.
    Liegt somit nicht im Wertebereich eines signed char (von -127 bis 127)

    Du brauchst für deinen Fall einen unsigned char (Wertebereich 0-255) um deinen
    Wert abzudecken:

    unsigned char s='À';
    printf("%x " , s ) ;
    


  • mgaeckler schrieb:

    %x erwartet einen integer Du übergibst aber ein char. Bin mir jetzt allerdings nicht sicher, ob das nicht automatisch erweitert wird.

    Genau das ist es, es liegt an der Ellipse in der Parameterliste von printf. Diese Parameter werden den default argument promotions unterworfen, d.h. unter anderem char wird zu int und float wird zu double konvertiert. Das fällt auch auf, wenn man sich die Beschreibung der Formatangaben %c und %f mal genau anguckt 🙂



  • printf("%02x " , s[i] ) ;
    

    müsste leisten was du willst


Anmelden zum Antworten