/C++

2010-05-17 16 views
12

scanf का उपयोग कर एक पूर्णांक पढ़ने के लिए हम का उपयोग करें:/C++

scanf("%d",&i); 

क्या i अगर लंबे समय तक int नहीं है ??

नोट: जब %d का उपयोग कर long साथ यह मुझे एक चिड़चिड़ी चेतावनी देता है ..

धन्यवाद!

+4

"क्या होगा यदि मैं लंबे समय तक नहीं हूं ??" - अगर आप दस्तावेज़ीकरण पढ़ते हैं तो क्या होगा? मानक पुस्तकालय जानबूझकर अच्छी तरह से प्रलेखित है (कई स्थानों पर)। आरटीएफएम द्वारा उत्तर दिए जाने वाले प्रश्नों को पोस्ट करने की आवश्यकता नहीं होनी चाहिए। http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ – Clifford

+1

@Clifford: मुझे दिखाएं कि उस पृष्ठ पर कहां यह कहता है कि यह एक त्रुटि है यदि सूचक प्रकार अपेक्षित से मेल नहीं खाता है? निश्चित रूप से, यदि आप मेमोरी एक्सेस को ठीक से ग्रोक करते हैं और यह फ़ंक्शन कैसे काम करता है, तो यह स्पष्ट है कि "इंगित करना चाहिए ... उनके संबंधित प्रारूप टैग द्वारा निर्दिष्ट प्रकार की ऑब्जेक्ट्स" एक मजबूत "चाहिए" है, लेकिन यह तुरंत अन्यथा स्पष्ट नहीं है । जिज्ञासा से, मैंने "मैन स्कैनफ" को गुगल किया ... पहला लिंक "चाहिए" के बजाय "जरूरी" कहता है, जो बेहतर है, लेकिन फिर 'डी' फ्लैग का वर्णन करते समय, यह कहता है "अगला पॉइंटर एक सूचक होना चाहिए int "करने के लिए" संभव modifiers का कोई उल्लेख नहीं है। –

+0

@ डेनिस; इस तथ्य के अलावा कि यह प्रश्न एक वर्ष से अधिक पुराना है और मेरी टिप्पणी ने अब तक टिप्पणी कभी नहीं उठाई है, 'लंबा' 'int' का एक संशोधक नहीं है, यह डेटा प्रकार अपने अधिकार में है - यहां तक ​​कि जब 'लंबा int' लिखा जाता है। % D प्रारूप विनिर्देशक * अलग-अलग आकार पूर्णांक प्रकारों के लिए 'संशोधक' है, और वे * दिए गए लिंक में दस्तावेज हैं। निहितार्थ से यदि 'long' ("% ld") के लिए कोई विशिष्ट प्रारूप विनिर्देशक है, तो 'int' के लिए इच्छित प्रारूप विनिर्देशक गलत होगा, अन्यथा अलग प्रारूप विनिर्देशक की आवश्यकता नहीं होगी। – Clifford

उत्तर

20

बस

long l; 

scanf("%ld", &l); 

यह मुझे एक चिड़चिड़ी चेतावनी देता है ..

का उपयोग चेतावनी बहुत सही है कि। यह ढेर भ्रष्टाचार के लिए भीख मांग रहा है।

+0

जबकि आपका कोड बस अपरिभाषित व्यवहार देता है। आपको वैरिएबल के पते को स्कैनफ को पढ़ने की आवश्यकता है। –

2
scanf("%ld", &i); 

तुम भी एक long long के लिए "%Ld" उपयोग कर सकते हैं (और अपने संकलक पर निर्भर करता है, कभी कभी भी "%lld")।

अधिक जानकारी के लिए स्कैनफ़ मैन पेज के रूपांतरण अनुभाग पर नज़र डालें। (बस अगर यह आपके सिस्टम में मैनपेज नहीं है तो Google इसे)।

+0

और क्या वही आदमी पृष्ठ नहीं कहता है कि जिन चीज़ों को आप पढ़ रहे हैं उन्हें स्कूटर को पॉइंटर्स के रूप में पास करने की आवश्यकता है? –

+1

'लंबे समय तक (int) ',"% lld "मानक है (" एल "संशोधक' लंबे डबल 'के लिए है, इसलिए"% एलडी "मानक नहीं है, हालांकि मुझे संदेह नहीं है कि कुछ कार्यान्वयन अनुमति यह)। बीएसडी स्वादों ने एक बार "क्वाडवर्ड" के लिए "क्यू" लम्बाई संशोधक का उपयोग किया, जो कि केवल 64-बिट मान है, और मुझे यकीन है कि यह अभी भी कुछ बीएसडी-आधारित कार्यान्वयन में स्वीकार किया गया है। माइक्रोसॉफ्ट ने क्रमशः 64-बिट और 32-बिट पूर्णांक निर्दिष्ट करने के लिए "I64" और "I32" लंबाई संशोधक बनाए, इसलिए "% I64d" उस मामले में मान्य होगा। दूसरे शब्दों में, जब लंबे प्रारूपित I/O फ़ंक्शंस की बात आती है तो 'लंबे समय तक' भ्रम की गड़बड़ी होती है। : पी – Dustin

6
देवताओं खातिर

:

long n; 
scanf("%ld", & n); 
+1

नील के उत्तर में जोड़ने के लिए, आप 'long int' को पढ़ने के लिए "% d" जैसे कुछ पर भरोसा नहीं कर सकते क्योंकि यह 'लंबी (int)' की बजाय 'int' निर्दिष्ट करता है। इतना ही नहीं, कुछ 64-बिट सिस्टम पर 'int' आकार में 32 बिट्स है जबकि' लंबा (int) 'आकार में 64 बिट्स है। दूसरे शब्दों में, आप 64-बिट स्टोरेज स्थान होने के लिए 32-बिट पूर्णांक पढ़ रहे होंगे। एक उदाहरण 2147483649 पढ़ा जाएगा। चूंकि 32-बिट मान 64-बिट स्थान में पढ़ा जाता है, इसलिए अन्य 32 बिट्स जो भी मूल्य मौजूद होते हैं, उनके साथ छोड़ दिया जाता है, इसलिए यदि आपको मूल रूप से 42 9 4 9 672 9 6 संग्रहित किया गया था तो आपको 6442450 9 45 की तरह कुछ मिल सकता है। – Dustin

3

प्रत्येक रूपांतरण विनिर्देशक उसके संगत तर्क एक विशिष्ट प्रकार के होने की अपेक्षा करता है; यदि तर्क का प्रकार अपेक्षित प्रकार से मेल नहीं खाता है, तो व्यवहार अपरिभाषित है। आकार की एक पूरी सूची के लिए

long i; 
scanf("%ld", &i); 

चेक ऑनलाइन draft C standard (.pdf फ़ाइल), खंड 7.19.6.2, पैरा 11: आप scanf() के साथ एक लंबी में पढ़ना चाहते हैं, तो आप %ld रूपांतरण विनिर्देशक उपयोग करने की आवश्यकता संशोधक और अपेक्षित प्रकार।

-1

इसे जांचें, यहां जवाब है: "% I64d"

+4

गैर-मानक एक्सटेंशन होने के अतिरिक्त, 'लंबे' कई प्रणालियों पर साठ-बिट बिट प्रकार नहीं है। –