Char als Zahlenwert einlesen mit scanf



  • Guten Tag

    Ein Kollege von mir möchte einen zahlenwert des Typ char einlesen und hat dies mit folgender scanf-Zeile gemacht:

    char zahl;
    scanf("%hd",&zahl);
    

    Das Problem dabei ist, dass es je nach Compiler funktioniert oder auch nicht, weil %hd ja einen Wert von 2 Byte einlesen kann und die Variable zahl im Speicher nur ein Byte reserviert hat.
    1. Er glaubt mir nicht so recht, weil es ja manchmal geht (z.B. Reihenfolge der Var-Deklaration ändern).
    2. Ich konnte ihm nicht sagen mit welchem Formatzeichen er scanf betreiben müsste, um den Char als Zahlenwert einlesen zu können. Ich habe zwar noch %hhd gefunden, aber das geht irgendwie nicht.

    Kann mir jemand helfen?



  • 1. Ob das geht, hängt von vielen Faktoren ab - Speicher-Layout, Padding-Maßnahmen des Compilers, Glück etc. Und wenn etwas schiefgeht, fällt das Problem vermutlich nicht in der eingelesenen Variablen auf, sondern in ihren Nachbarn:

    char dummy1 = 1,value,dummy2 = 1;
    scanf("%hd",&value);
    printf("%d %d\n",dummy1,dummy2);//Wenn hier tatsächlich noch "1 1" ausgegeben wird, hast du Glück gehabt
    

    2. Nein, es gibt keine Formatkennung für "char dezimal" - der sicherste Weg wäre da über eine Zwischenvariable:

    short temp;
    scanf("%hd",&temp);
    zahl = (char)temp;
    


  • Vielen Dank für die schnelle Antwort.

    Ich habe zwei Tests gemacht mit deinem Programm.
    Dev C/C++ legt alle char-Variablen hintereinander im Speicher ab.
    Visual C++ 2005 lässt einen Abstand von drei Byte zwischen den Variablen.

    Also "funktioniert" dein Programm leider mit Visual C++ 2005, wegen dem "Sicherheitsabstand" zwischen den Variablen im Speicher. Lausige Memory-Verschleuderer. Dafür weiss ich jetzt, warum Windows so viel Speicherplatz benötigt. 🙂



  • twobi schrieb:

    Also "funktioniert" dein Programm leider mit Visual C++ 2005, wegen dem "Sicherheitsabstand" zwischen den Variablen im Speicher. Lausige Memory-Verschleuderer.

    Das Ding nennt sich nicht "Sicherheitsabstand", sondern "Padding" 😉


Anmelden zum Antworten