स्कैनफ () को डबल्स के लिए "% lf" की आवश्यकता क्यों है, जब प्रिंटफ () सिर्फ "% f" के साथ ठीक है?


179

ऐसा क्यों है, जिसे पढ़ते समय " " की scanf()आवश्यकता होती है , जब " " का तर्क एक या एक की परवाह किए बिना " " का उपयोग कर सकता है ।l%lfdoubleprintf()%fdoublefloat

उदाहरण कोड:

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

1
मुझे समझ में नहीं आता कि आप यहाँ POINTER द्वारा क्या मतलब है। Scanf में हम केवल पास और वेरिएबल (यानी) एड्रेस को

7
@deetchanya C में, जब आप "एक &परिचालक के साथ एक वैरिएबल का पता" लेते हैं , तो उस ऑपरेशन का परिणाम मेमोरी में वेरिएबल के स्टोरेज लोकेशन के लिए एक पॉइंटर होता है। यह वह सूचक है जिसे पारित किया जाता है scanf
zwol

जवाबों:


207

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


26

चूँकि С99 फॉर्मेट स्पेसिफ़र्स और फ़्लोटिंग-पॉइंट तर्क प्रकारों के बीच मिलान सी में संगत है printfऔर scanf। यह है

  • %f के लिये float
  • %lf के लिये double
  • %Lf के लिये long double

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

लेकिन वास्तव में व्यवहार में ऐसा करने का कोई कारण नहीं है। का प्रयोग न करें %fके printfप्रकार के तर्कों double। यह C89 / 90 बार में पैदा हुई एक व्यापक आदत है, लेकिन यह एक बुरी आदत है। उपयोग %lfमें printfलिए doubleऔर रखने %fके लिए आरक्षित floatतर्क।


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

С99 के बाद से सी में प्रारूप विनिर्देशक और फ्लोटिंग प्वाइंट तर्क प्रकार के बीच मिलान के बीच संगत है printfऔर scanf ध्यान दें कि इसका मतलब यह नहीं है कि एक ही प्रारूप विनिर्देशक का उपयोग करने का अर्थ है कि कैन द्वारा लिखित डेटा [f]printf()को पढ़ा जा सकता है [f]scanf()। सामान्य तौर पर, इसके लिए उपयोग किए जाने वाले समान प्रारूप scanf()का उपयोग करके डेटा को सफलतापूर्वक नहीं पढ़ा printf()जाएगा । उदाहरण के लिए, स्पेस पैडिंग जिसे एक 's फॉर्मेट स्पेसियर ' द्वारा डाला जा सकता है, कॉल में उसी फॉर्मेट स्पेसियर द्वारा छोड़ दिया जाएगा । prinf()"%d""%d"scanf()
एंड्रयू हेनले

16

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


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

7

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


2

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


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

1
सी भाषा floatमूल्यों के पूर्व-मानक संस्करणों doubleमें अभिव्यक्तियों में स्वचालित रूप से प्रचारित किया गया था। उस नियम को मानक सी में छोड़ दिया गया था। आम तौर पर, अभिव्यक्ति में floatपदोन्नति नहीं होती है double। इसे केवल तभी प्रचारित किया जाता है doubleजब इसे एक वैचारिक तर्क के रूप में पारित किया जाता है, जो इस मामले में होता है।
एनटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.