2013-01-03 9 views
14

Ich versuche, diesen Code zu verwenden, um Werte zwischen 0 bis 255 (unsigned char) zu lesen.Verwenden von Scanf zum Lesen eines unsigned char

#include<stdio.h> 
int main(void) 
{ 
    unsigned char value; 

    /* To read the numbers between 0 to 255 */ 
    printf("Please enter a number between 0 and 255 \n"); 
    scanf("%u",&value); 
    printf("The value is %u \n",value); 

    return 0; 
} 

Ich bekomme die folgende Compiler-Warnung wie erwartet.

Warnung: Format ‚% u‘ erwartet ‚unsigned int *‘ eingeben, aber Argument hat 2 ‚unsigned char *‘

Und das ist meine Ausgabe für dieses Programm eingeben.

Bitte geben Sie eine Zahl zwischen 0 und 255 Der Wert 45 ist Segmentation fault

ich die Segmentation Fault zu tun bekommen, während Sie diesen Code ausgeführt wird.

Was ist der beste Weg, unsigned char-Werte mit scanf zu lesen?

+0

% c verwenden, um ein Byte zu lesen – TJD

+10

Eigentlich '% hhu' für' unsigned char'. – Joe

+0

@TJD. Ich möchte keinen Saibling lesen. Ich möchte Werte zwischen 0 und 255 lesen. – user1293997

Antwort

31

Der Spezifizierer %u erwartet eine Ganzzahl, die zu undefiniertem Verhalten führen würde, wenn diese in eine unsigned char gelesen wird. Sie müssen den unsigned char Spezifizierer %hhu verwenden.

+0

Das ist wirklich in Ordnung - aber so traurig gcc beschwert sich im C89/C90-Modus - und weitere ms beschwert sich auch: '% hhu' wird nicht früher als C99 unterstützt, soweit ich weiß. –

+1

@BastianEbeling ja [hier] (http://www.cplusplus.com/reference/cstdio/scanf/) 'hh' ist als gelb markiert, was bedeutet, dass es seit C99 eingeführt wurde. Ich frage mich, wie man es in C89 lesen kann –

+1

Es gibt ein Beispiel unten, das jetzt gelöscht wird, das ['getchar()'] (http://en.cppreference.com/w/cpp/io/c/getchar) verwendet. – Joe

0

Für vor C99 würde ich in Erwägung ziehen, eine extra Funktion für diese nur allein zu schreiben, um diesen Segmentierungsfehler aufgrund undefinierten Verhaltens von scanf zu vermeiden.

Ansatz:

#include<stdio.h> 
int my_scanf_to_uchar(unsigned char *puchar) 
{ 
    int retval; 
    unsigned int uiTemp; 
    retval = scanf("%u", &uiTemp); 
    if ( retval == 1 
     && uiTemp < 256; 
    ) 
    { 
    *puchar = uiTemp; 
    } 
    return retval; 
} 

ersetzen Dann < scanf ("% u",> mit < my_scanf_to_uchar (>

Hoffnung dieses Thema nicht weg ist, wie ich noch scanf verwendet und nicht eine andere Funktion wie getchar :)

Ein anderer Ansatz (ohne zusätzliche Funktion)

if (scanf("%u", &uiTemp) == 1 && uiTemp < 256) { value = uitemp; } 
else {/* Do something for conversion error */}