2013-08-21 7 views
5

हाय अब मैं सी भाषा सीख रहा हूं और मुझे पढ़ने वाली पुस्तक के अभ्यास में मुझे कोई समस्या है। मेरे कोड यह है:स्कैनफ़() स्टोर मूल्यों को स्कैन कर सकते हैं?

#include<stdio.h> 
int main() 
{ 
    unsigned char one=0; 
    unsigned char two=0; 
    printf("Quantity 1 = "); 
    scanf("%d",&one); 
    printf("Quantity 2 = "); 
    scanf("%d",&two); 
    printf("The value is %d",one); 
    return 0; 
} 

क्यों जब मैं scanf के बाद one का मूल्य प्रारंभिक मूल्य दिखाई देता है और न मूल्य देखने के लिए कोशिश कर रहा हूँ?

+0

में आपका स्वागत है अतः करने के लिए। अच्छा सवाल आपके प्रश्न का प्रदर्शन। – chux

+0

नीचे @Shade द्वारा दिए गए लिंक पर दिए गए अनुसार, यदि आप 'हस्ताक्षरित char' को चर प्रकार के रूप में उपयोग करना चाहते हैं, तो आप '% c' या'% hhu' प्रारूप निर्दिष्ट कर सकते हैं –

+0

मूल कारण यहां एक ही समस्या है [ जब चरित्र को पढ़ने और int पढ़ने के लिए, मूल्य 4096 + ascii क्यों है] (http://stackoverflow.com/q/4973125/1281433)। 'scanf' मानों को स्टोर कर सकता है, लेकिन चूंकि एक' हस्ताक्षरित चार 'एक' int' (जो '% d' अपेक्षाओं के समान) के समान आकार नहीं है, इसलिए 'printf' प्राप्त होता है उस स्थान पर' printf' की अपेक्षा करता है। यह भी देखें [स्कैनफ और चार को एक पूर्णांक के रूप में रखते हुए] (http://stackoverflow.com/q/17643453/1281433)। –

उत्तर

8

आप %d विनिर्देशक है, और %c विनिर्देशक साथ char के साथ conjuction में int प्रकार का उपयोग करने की जरूरत है। और %u बिना हस्ताक्षर किए पूर्णांक के साथ।

#include<stdio.h> 
int main() 
{ 
    unsigned int one=0; unsigned int two=0; 
    printf("Quantity 1 = ");scanf("%u",&one); 
    printf("Quantity 2 = ");scanf("%u",&two); 
    printf("The value is %u",one); 
    return 0; 
} 

मूल रूप से, scanf इनपुट से पूर्णांक को पढ़ने के लिए कोशिश करेंगे और यह स्मृति स्थान कि इतना बड़ा नहीं है, तो आप अपरिभाषित व्यवहार होगा अंदर यह स्टोर करने के लिए कोशिश करेंगे।

आपको अच्छा संदर्भ here मिल सकता है।

हालांकि, यदि आप इनपुट प्रकार के लिए चरित्र का उपयोग करने का प्रयास करते हैं, तो आप खुद से पूछ सकते हैं कि आपको दूसरी मात्रा में प्रवेश करने का मौका क्यों नहीं मिलेगा (यदि आप 4 टाइप करते हैं और एंटर दबाते हैं)। ऐसा इसलिए है क्योंकि दूसरा scanf एक वर्ण के रूप में एंटर कुंजी पढ़ेगा। इसके अलावा, यदि आप 21 (बीस के लिए) टाइप करने का प्रयास करते हैं, तो यह 2 और 1 (साथ ही, उनके ASCII मानों के साथ) के साथ पहला मान भर देगा।

तो, सावधान रहें - सुनिश्चित करें कि आप हमेशा अपने चर के लिए सही प्रकार चुनते हैं।

+3

और हस्ताक्षर किए गए पूर्णांक से निपटने के दौरान आप '% u' का उपयोग करते हैं। (http: // www। cplusplus.com/reference/cstdio/printf/) – Shade

+0

हां, धन्यवाद! –

+0

@nishantant या '% hhd','% hhi', '% hho' या'% hhx'। – chux

1

जांचें कि scanf() अपने वापसी मूल्य को पढ़कर ठीक से काम कर रहा है। क्विकस्टार्ट के लिए, scanf() पर this link पर विवरण पढ़ें।

आप क्या कर रहे हैं "%d" का उपयोग unsigned char चर में एक पूर्णांक इनपुट कर रहा है, इसलिए scanf() ऐसा नहीं हो सकता है जैसा कि इसे करना चाहिए।

1

बदलें

unsigned char one=0; unsigned char two=0; 

को
unsigned int one=0; unsigned int two=0; 

और भी %d के बजाय %u का उपयोग तो यह scanf() के बाद मूल्य प्रिंट होगा।

3

Never use scanfNever use scanf गंभीरता से, never use scanf

उपयोग fgets (या getline, आप इसे किया है) उपयोगकर्ता से इनपुट की एक पूरी लाइन को पढ़ने के लिए है, तो तार नंबरों के लिए strtol या उसके रिश्तेदारों strtod और strtoul साथ परिवर्तित। strsep भी उपयोगी हो सकता है।

+1

@ पॉलकाइस, स्कैनफ के साथ कुछ भी गलत नहीं है, जब उपयोग करें डी सही ढंग से। लोग परेशानी में पड़ते हैं क्योंकि वे इसके दस्तावेज नहीं पढ़ते हैं। यदि आपका स्कूल असाइनमेंट स्कैनफ का उपयोग करता है तो स्कैनफ का उपयोग करना सीखें, यह दस्तावेज़ीकरण पढ़ने में एक अच्छा अभ्यास है। – JackCColeman

+0

@ जैकसीसीओलमैन "इनपुट ओवरफ्लो अपरिभाषित व्यवहार ट्रिगर करता है" प्रोग्रामर की बजाय स्कैनफ में निश्चित रूप से एक गलती है (और इसका उपयोग करने में भी कठिनाई होती है, यह भी स्पष्ट रूप से सही ढंग से सही ढंग से उपयोग करने में कठिनाई है, यह भी आईएनएनएसएचओ में एक गलती है। पीड़ित को दोष मत दो। – zwol

+0

@Zack यह कहां कहता है? कहीं भी नहीं। – JackCColeman

1

आप चर one घोषित एक चार होने के लिए:

unsigned char one=0; 

लेकिन तब आप scanf बताया पढ़ने के लिए एक int:

scanf("%d",&one); /* %d means int */ 

इंट चार से (आमतौर पर 4-बाइट बनाम बड़ा है 1-बाइट), जिससे आप जिस समस्या का वर्णन करते हैं उसका कारण बनता है।

बदलें

अपने scanf रहे हैं:

scanf("%c",&one); /* %c means char */ 

फिर जब आप मूल्य प्रिंट आउट, यह भी एक चार प्रिंट:

printf("The value is %c",one); /* %c means char */ 
+0

मैं यह नहीं कह सकता कि यह @ पॉलकाइस से प्रासंगिक है, क्योंकि वह सी के लिए नया है, लेकिन '% c' का उपयोग करके' char' पढ़ने के लिए 'scanf()' एक अच्छा फ़ंक्शन है? –

संबंधित मुद्दे