2013-01-03 18 views
14

पढ़ने के लिए स्कैनफ़ का उपयोग करके मैं 0 से 255 (हस्ताक्षरित चार) के बीच मान पढ़ने के लिए इस कोड का उपयोग करने का प्रयास कर रहा हूं।एक हस्ताक्षरित चार

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

मुझे अपेक्षित के रूप में निम्न संकलक चेतावनी मिलती है।

चेतावनी: प्रारूप '% यू' टाइप की उम्मीद 'अहस्ताक्षरित int *', लेकिन तर्क 2 टाइप 'अहस्ताक्षरित चार *'

है और यह इस कार्यक्रम के लिए मेरी उत्पादन होता है।

एक संख्या दर्ज करें मूल्य 0 और 255 के के बीच 45 विभाजन गलती

मैं इस कोड चलाते समय विभाजन गलती मिलता है है।

स्कैनफ़ का उपयोग करके हस्ताक्षरित चार मान पढ़ने का सबसे अच्छा तरीका क्या है?

+0

एक बाइट – TJD

+10

पढ़ने के लिए% c का उपयोग करें 'असीमित चार' के लिए वास्तव में '% hhu'। – Joe

+0

@ टीजेडी। मैं एक char पढ़ना नहीं चाहता। मैं 0 से 255 के बीच मान पढ़ना चाहता हूं। – user1293997

उत्तर

31

%u विनिर्देशक एक पूर्णांक की अपेक्षा करता है जो unsigned char में पढ़ने के दौरान अपरिभाषित व्यवहार का कारण बनता है। आपको unsigned char विनिर्देश %hhu का उपयोग करने की आवश्यकता होगी।

+0

यह वास्तव में ठीक है - लेकिन इतनी दुखी जीसीसी सी 8 9/सी 9 0 मोड में शिकायत करती है - और आगे एमएस शिकायत भी करती है: '% hhu' को सी 99 से पहले समर्थित नहीं है जहां तक ​​मुझे पता है। –

+1

@BastianEbeling yes [here] (http://www.cplusplus.com/reference/cstdio/scanf/) 'hh' को पीले रंग के रूप में चिह्नित किया गया है जिसका अर्थ है कि इसे अभी सी 99 के बाद पेश किया गया है। मुझे आश्चर्य है कि इसे C89 –

+1

में कैसे पढ़ा जाए, नीचे एक उदाहरण है जिसे अब हटा दिया गया है जो ['getchar()'] (http://en.cppreference.com/w/cpp/io/c/getchar) का उपयोग करता है। – Joe

0

प्री सी 99 के लिए मैं स्कैनफ के अपरिभाषित व्यवहार के कारण उस सेगमेंटेशन गलती से बचने के लिए केवल के लिए एक अतिरिक्त फ़ंक्शन लिखने पर विचार करता हूं।

दृष्टिकोण:

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

फिर < scanf ("% u",> < my_scanf_to_uchar (>

आशा के साथ बदलें इस बंद विषय के रूप में मैं अभी भी scanf का इस्तेमाल किया और नहीं नहीं है Getchar जैसे एक और समारोह :)

एक और दृष्टिकोण (अतिरिक्त समारोह के बिना)

if (scanf("%u", &uiTemp) == 1 && uiTemp < 256) { value = uitemp; } 
else {/* Do something for conversion error */} 
संबंधित मुद्दे