2016-07-22 49 views
-1

Ich habe eine Frage zu Konvertierungsspezifizierer von scanf in C.über Konvertierungsspezifizierer von scanf in C

#include <stdio.h> 

int main(void) 
{ 
    int num1; 
    scanf("%hhd",&num1); 
    printf("%d \n",num1); 
} 

Da ich "%hhd" als Konvertierungsspezifizierer in scanf Funktion eingegeben habe, wenn meine Eingabe „128“ ist, Ich erwarte, dass -128 in num1 gespeichert wird. Aber das Ergebnis zeigt, dass 128 in num1 gespeichert ist.

Warum passiert das, obwohl ich "%hhd" verwendet habe, um Eingabe als char int zu spezifizieren?

+4

Sieht aus wie ein undefiniertes Verhalten zu mir. – melpomene

+0

Mögliches Duplikat von [Konvertieren eines int in char mit printf] (http://stackoverflow.com/questions/13595628/converting-an-int-to-char-using-printf) –

+0

"% hhd" gibt an, dass der Zeiger das Ergebnis sein soll behandelt werden als "der nächste Zeiger ist ein Zeiger auf ein vorzeichenbehaftetes Zeichen oder vorzeichenloses Zeichen." Dies bedeutet, dass (wenn CHAR_BITS 8 ist, keine unangemessene Annahme), entweder 128 oder -128 perfekt gültige Ergebnisse sind. – Vatine

Antwort

2

Schritt 1 Mit scanf() Probleme: Überprüfen Sie die Ergebnisse. Wenn der Rückgabewert nicht anzeigt, dass etwas in num1 geschrieben wurde, spiegelt das Drucken keine Benutzereingaben wider.

int num1; 
if (scanf("%hhd",&num1) == 1) { 
    printf("%d \n",num1); 
} 

Schritt 2: Compiler Warnungen aktivieren. Spart Zeit.

if (scanf("%hhd",&num1) == 1) { 
// warning: format '%hhd' expects argument of type 'signed char *', 
// but argument 2 has type 'int *' [-Wformat=] 

Warum dies geschieht, obwohl ich "%hhd" verwendet haben Eingang als char int angeben?

Dies nicht etwa Integer-Typ: int gegen char. Das ist über Zeiger: int * gegenüber signed char *. "%hhd" in scanf() entspricht einem Zeiger: signed char * (oder unsigned char * oder char *), kein int noch char.

Code übergeben &num1, ein int *. Kompatibler Code würde eine signed char * übergeben.

Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten nicht definiert. C11 §7.21.6.2 13

Das ist es. Code hat die Regeln gebrochen, erwartetes Verhalten tritt nicht auf. Verwenden Sie den richtigen Typ.

signed char num1; 
if (scanf("%hhd",&num1) == 1) { 
    printf("%d \n",num1); 
} 

Wenn Code das Ergebnis in einem int speichern müssen:

int num1; 
signed char ch1; 
if (scanf("%hhd",&ch1) == 1) { 
    num1 = ch1; 
    printf("%d \n",num1); 
}