2009-10-27 19 views
9
#include <stdio.h> 

int main() 
{ 
    float a = 5; 
    printf("%d", a); 
    return 0; 
} 

यह उत्पादन देता है के लिए पूर्णांक प्रारूप स्ट्रिंग निर्दिष्ट?printf नाव

+0

कोड स्वरूपण का उपयोग करें। – Ree

+0

'# शामिल 'हटाया गया क्योंकि आवश्यक नहीं - अन्य सफाई भी। –

उत्तर

13

यह 5 प्रिंट नहीं करता है क्योंकि संकलक स्वचालित रूप से पूर्णांक में नहीं डाला जाता है। आपको (int)a स्वयं करने की आवश्यकता है।

कहना है कि,

#include<stdio.h> 
void main() 
{ 
float a=5; 
printf("%d",(int)a); 
} 

सही ढंग से आउटपुट 5.

#include<stdio.h> 
void print_int(int x) 
{ 
printf("%d\n", x); 
} 
void main() 
{ 
float a=5; 
print_int(a); 
} 

जहां संकलक सीधे किसी पूर्णांक पर नाव कास्ट करने के लिए, की वजह से जानता है के साथ कि इस कार्यक्रम की तुलना करें print_int की घोषणा।

+0

विशेष रूप से, यह एक वैरिएडिक फ़ंक्शन में स्वचालित रूप से पूर्णांक में नहीं डाला जाता है, लेकिन शुरुआती को समझाना मुश्किल है, खासकर जब से यह सुनिश्चित होता है कि सी कंपाइलर को शामिल प्रकारों को जानना चाहिए। –

+1

वैरिएडिक-नेस के अलावा, यह जानने के लिए कि किस प्रकार कास्ट करना है, उसे कंप्रेसर को printf को पारित स्ट्रिंग को पार्स करने और किस प्रकार का होना चाहिए, उसे कम करने के लिए आवश्यक होगा। जीसीसी आसानी से स्थिर "% d \ n" को संभाल सकता है और आपको '-वॉल' पारित होने पर चेतावनी देता है, लेकिन अच्छी किस्मत जब स्ट्रिंग को प्रोग्राम में हार्ड-कोड नहीं किया जाता है! –

+0

@MarkRushakoff उचित प्रोग्रामर गैर-स्थिर प्रारूप तारों का उपयोग नहीं करते हैं, क्योंकि वे सुरक्षा समस्या पेश करते हैं। –

12

%d प्रारूप विनिर्देशक का उपयोग केवल int के मानों के साथ किया जा सकता है। आप double पास कर रहे हैं (जो float को पूरी तरह से परिवर्तित कर दिया जाएगा)। परिणामी व्यवहार अपरिभाषित है। "इसका प्रिंट क्यों करता है?" का कोई जवाब नहीं है सवाल। कुछ भी मुद्रित किया जा सकता है। वास्तव में, कुछ भी हो सकता है।

पीएस

  1. यह int main है, void main नहीं।
  2. ऐसी कोई आप एक नाव मूल्य मुद्रण के लिए% च का उपयोग करना चाहेंगे मानक सी
+1

+1 यह इंगित करने के लिए कि printf() को दोहराया गया है। मैंने अधूरा और अप्रासंगिक '# शामिल करें ' को हटाने के लिए कोड को ठीक किया। –

4

में conio.h के रूप में शीर्ष लेख नहीं है।

जैसे

float a=5; 
printf("%f",a); 
5

आप या तो इसे किसी पूर्णांक पर डाली चाहिए% d उपयोग करें, या कोई दशमलव परिशुद्धता के साथ नाव प्रदर्शित करने के लिए एक प्रारूप स्ट्रिंग का उपयोग करना:

void main() { 
    float a=5; 
    printf("%d",(int)a); // This casts to int, which will make this work 
    printf("%.0f",a); // This displays with no decimal precision 
} 
5

आप उपयोग करने की आवश्यकता %f बजाय %d - %d सिर्फ पूर्णांकों के लिए है, जबकि %f चल बिन्दु के लिए है:

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    float a=5; 
    printf("%f",a); 
} 
012,
1

जैसा कि अन्य लोगों ने कहा था, आपको प्रारूप स्ट्रिंग में %f का उपयोग करने की आवश्यकता है या a को एक int में कनवर्ट करना होगा।

लेकिन मैं यह इंगित करना चाहता हूं कि आपका कंपाइलर शायद printf() की प्रारूप स्ट्रिंग के बारे में जानता है और आपको बता सकता है कि आप इसे गलत उपयोग कर रहे हैं।

$ /usr/bin/gcc -Wformat tmp.c 
tmp.c: In function ‘main’: 
tmp.c:4: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’ 

$ /usr/bin/gcc -Wall tmp.c 
tmp.c: In function ‘main’: 
tmp.c:4: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’ 

$ 

ओह, और एक और बात:: मेरी संकलक, उचित मंगलाचरण (-Wall-Wformat भी शामिल है) के साथ, यह कहते हैं कि आप printf() में शामिल होना चाहिए '\ n' उत्पादन सुनिश्चित करने के लिए आउटपुट डिवाइस को भेजा जाता है ।

printf("%d\n", a); 
/*  ^^ */ 

या printf() के बाद fflush(stdout); का उपयोग करें।