2013-01-03 263 views
14

我試圖用這段代碼讀取0到255之間的值(無符號字符)。使用scanf讀取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; 
} 

我按預期得到了下面的編譯器警告。

警告:格式「%U」型預計「無符號整數*」,但實參2的類型爲「無符號字符*」

,這是我對這一計劃的輸出。

請輸入一個數字從0到255 值是45 分段故障

我這樣做,同時運行此代碼得到分段錯誤。

什麼是使用scanf讀取無符號字符值的最佳方法?

+0

使用%c讀取一個字節 – TJD

+10

實際上'%hhu'爲'unsigned char'。 – Joe

+0

@TJD。我不想讀取字符。我想讀取0到255之間的值。 – user1293997

回答

31

%u說明符需要一個整數,當將其讀入unsigned char時,該整數會導致未定義的行爲。您將需要使用unsigned char說明符%hhu

+0

這真的很好 - 但很遺憾gcc在C89/C90模式下抱怨 - 另外ms也抱怨說:據我所知,'%hhu'並不早於C99。 –

+1

@BastianEbeling是[這裏](http://www.cplusplus.com/reference/cstdio/scanf/)'hh'被標記爲黃色,這意味着它自C99以來才被引入。我想知道如何在C89中讀取 –

+1

下面有一個例子,它現在被刪除,它使用['getchar()'](http://en.cppreference.com/w/cpp/io/c/getchar)。 – Joe

0

對於C99之前的版本,我會考慮爲這個 單獨編寫一個額外的函數,以避免由於scanf的未定義行爲導致的分段錯誤。

方法:

#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; 
} 

然後用< my_scanf_to_uchar(>

希望更換< 的scanf( 「%U」,>這是不是因爲我還是用scanf函數,而不是題外話另一個函數如getchar :)

另一種方法(不帶額外功能)

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