2008-10-16 14 views
162

क्यों कि scanf() की जरूरत में l "%lf" जब एक double पढ़ने, जब printf() उपयोग कर सकते हैं "%f" भले ही अपने तर्क एक double या एक float है की यह क्या है?स्कैनफ() को युगल के लिए "% lf" क्यों चाहिए, जब printf() केवल "% f" के साथ ठीक है?

उदाहरण कोड:

double d; 
scanf("%lf", &d); 
printf("%f", d); 
+1

मुझे समझ में नहीं आता कि आपका क्या मतलब है POINTER द्वारा। स्कैनफ़ में हम केवल पास और परिवर्तनीय (यानी) पता पास करते हैं, इसलिए पॉइंटर –

+7

@deetchanya इन सी कहां है, जब आप यूनरी '&' ऑपरेटर के साथ एक चर का पता लेते हैं, तो उस ऑपरेशन का परिणाम एक सूचक होता है मेमोरी में परिवर्तनीय भंडारण स्थान। यह वह सूचक है जो 'स्कैनफ' को पास किया जाता है। – zwol

+0

यह https: // stackoverflow के बारे में एक और पोस्ट है।कॉम/प्रश्न/9 2 9 1348/क्यों-स्कैन-काम नहीं कर रहा है-अपेक्षित-जब-लेखन-टू-ए-स्ट्रिंग-शाब्दिक – vimalpt

उत्तर

192

क्योंकि सी कार्यों कि चर तर्क ले के लिए युगल को तैरता को बढ़ावा देंगे। पॉइंटर्स को किसी भी चीज़ पर प्रचारित नहीं किया जाता है, इसलिए आपको युगल में पढ़ने के लिए %lf, %lg या %le (या %la सी 99 में) का उपयोग करना चाहिए।

+3

डिफ़ॉल्ट तर्क प्रचार मानक सी हैं, न केवल एमएसवीसी। –

+0

आपकी टिप्पणी के अनुसार तय किया गया। वाह! बिल्कुल सही होने के लिए – MSN

+4

+1। आईएमएचओ, यह दिखाता है कि स्कैनफ() एक भयानक कार्य है जिसे आपको वैकल्पिक रूप से सहन करना चाहिए यदि कोई विकल्प न हो। पॉइंटर्स को गलत प्रकार के डेटा में पास करके कपटपूर्ण दोषों को पेश करना बहुत आसान है, और निश्चित रूप से आपके द्वारा पारित पैरामीटर पर कोई प्रकार की जांच नहीं है। – AAT

16

scanf, पता करने के लिए डेटा का आकार &d द्वारा पर बताया जा रहा है, ठीक से भरने के लिए है, जबकि variadic कार्यों युगल को तैरता (पूरी तरह यकीन नहीं क्यों) को बढ़ावा देने की जरूरत है ताकि printf हमेशा एक double हो रही है।

+1

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

2

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

+5

फ्लोट को इस मामले में एक डबल * में परिवर्तित किया गया है * क्योंकि तर्क एक चर-लंबाई तर्क सूची का हिस्सा हैं, इसलिए फ्लोट को हमेशा सी –

+1

में युगल में परिवर्तित नहीं किया जाता है सी भाषा के 'फ्लोट' मानों के पूर्व-मानक संस्करणों में स्वचालित रूप से होते थे अभिव्यक्तियों में 'डबल' को पदोन्नत किया गया। उस नियम को मानक सी में छोड़ दिया गया था आम तौर पर, 'फ्लोट' को अभिव्यक्तियों में 'डबल' तक पदोन्नत नहीं किया जाता है। एक भिन्न तर्क के रूप में पारित होने पर इसे केवल 'डबल' तक प्रचारित किया जाता है, जो इस मामले में होता है। – AnT

7

क्योंकि अन्यथा स्कैनफ़ा सोचता है कि आप एक फ्लोट पर एक पॉइंटर पास कर रहे हैं जो एक डबल आकार से छोटा आकार है, और यह गलत मान लौटाएगा।

20

चूंकि एस 99 में प्रारूप विनिर्देशकों और फ़्लोटिंग-पॉइंट तर्क प्रकारों के बीच मिलान printf और scanf के बीच संगत है। यह यह सिर्फ इतना है कि जब प्रकार float के तर्कों variadic पैरामीटर के रूप में पारित कर रहे हैं, इस तरह के तर्क परोक्ष बदल रहे हैं के लिए long double

double

  • %Lf के लिए

    • float
    • %lf के लिए %f है double टाइप करने के लिए। यही कारण है कि printf प्रारूप विनिर्देशक %f और %lf बराबर और विनिमय करने योग्य हैं। printf में आप float या %fdouble के साथ "क्रॉस-उपयोग" कर सकते हैं।

      लेकिन वास्तव में अभ्यास में ऐसा करने का कोई कारण नहीं है। %fprintfdouble के तर्कों का उपयोग न करें। यह एक व्यापक आदत है जो सी 8 9/9 0 बार वापस पैदा हुई है, लेकिन यह एक बुरी आदत है। printf में double के लिए %ffloat तर्कों के लिए आरक्षित रखें।

  • +0

    मैं कहूंगा कि printf में '% f' का उपयोग करना एक अच्छी आदत है क्योंकि तब आपका कोड हमेशा काम करता है, जबकि कंपाइलर में C99 अनुपालन लाइब्रेरी नहीं है, तो'% lf' का उपयोग करना विफल हो सकता है। दुर्भाग्यवश यह स्थिति वास्तविकता में होती है। –

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