2012-07-26 10 views
7

मैं सी जानने की कोशिश कर रहा हूँ और निम्नलिखित छोटे कार्यक्रम के साथ आए हैं।प्रोग्रामिंग डेटा प्रकार

#include "stdafx.h" 

void main() 
{ 
    double height = 0; 
    double weight = 0; 
    double bmi = 0; 

    printf("Please enter your height in metres\n"); 
    scanf_s("%f", &height); 
    printf("\nPlease enter your weight in kilograms\n"); 
    scanf_s("%f", &weight); 
    bmi = weight/(height * height); 
    printf("\nYour Body Mass Index stands at %f\n", bmi); 
    printf("\n\n"); 
    printf("Thank you for using this small program. Press any key to exit"); 
    getchar(); 
    getchar(); 
} 

प्रोग्राम पूरी तरह से संकलित करता है, हालांकि कार्यक्रम द्वारा लौटाया गया जवाब समझ में नहीं आता है। अगर मैं वजन के लिए ऊंचाई के लिए 1.8 और 80 में प्रवेश, बीएमआई की तरह 1. # NF00 जो मतलब नहीं है है।

मैं क्या गलत कर रहा हूं?

+10

यह डबल्स के लिए '% lf' नहीं है? किसी भी मामले में, [आप शून्य main' उपयोग नहीं करना चाहिए '।] (http://stroustrup.com/bs_faq2.html#void-main) – chris

+0

पता करने के लिए अच्छी बात @chris। मैं हमेशा सिखाया गया था कि 'शून्य main' सी के लिए था, और' int main' सी के लिए था ++। मुझे आश्चर्य है कि नए सी/सी ++ प्रोग्रामर के लिए यह आदत कहां से आती है। – Darthfett

+0

@Darthfett, मुझे लगता है कि कुछ किताबें है कि का उपयोग 'शून्य main' देखते हैं। मैं कल्पना करता हूं कि यह सब कहाँ से पारित किया जा रहा है। – chris

उत्तर

10

scanf (और scanf_s) प्रारूप %f पॉइंटर float टाइप करने की अपेक्षा करता है।

बस इसे ठीक करने के लिए float पर height और weight चर के प्रकार को बदलें।

+0

कि :) धन्यवाद पूरी तरह से काम किया! मैंने ट्यूटोरियल के बाद% f का उपयोग किया था, मैं डबल के लिए इस्तेमाल किया गया% f का पालन कर रहा था। – Matthew

+1

@ मैथ्यू मुझे लगता है कि अब एक नया ट्यूटोरियल पाने का समय है। –

+0

मुझे ऐसा लगता है: धन्यवाद फिर से :) – Matthew

11

जब एक double साथ scanf उपयोग कर, आप, %lf विनिर्देशक का उपयोग करना चाहिए के रूप में संकेत दिए गए scanf साथ प्रचार नहीं कर रहे हैं।

अधिक जानकारी के लिए, निम्नलिखित प्रश्न पढ़ें: Why does scanf() need "%lf" for doubles, when printf() is okay with just "%f"?

4

मुझे लगता है कि scanf_s Syntaxis में इस मुद्दे को, आप 3-तृतीय तर्क है, जो बाइट्स में बफर के आकार है ommited। निम्नलिखित का प्रयास करें:)

scanf_s("%lf", &valueToGet, sizeof(double)); 
+1

उह, वह यहां 'char' स्कैन नहीं कर रहा है, आपको –

+0

हां पता है, मुझे पता है कि यह दिखाने के लिए कि मैं 3-rd तर्क की आवश्यकता है, जिसे मैंने जल्दी से एमएसडीएन से लिया था, क्योंकि मैंने जवाब पर जल्दी प्रतिक्रिया देने की कोशिश की थी, दिए गए कार्य पर उस उदाहरण को समायोजित करें, इसके लिए खेद है)) –

+0

संभवतः आप 'scanf_s' के बारे में बात कर रहे हैं, लेकिन आपने' scanf' लिखा है? प्रारूप विनिर्देशक भी गलत है। कृपया गलतियों को ठीक करें या उत्तर हटाएं। –

3

scanf() और printf (का दोष यह है कि यह बहुत सख्त प्रारूप की आवश्यकता है, नियंत्रण स्ट्रिंग और तर्क के बीच कोई बेमेल कठोर त्रुटि जो अपने इनपुट या आउटपुट नहीं कर बनाता है पैदा कर सकता है बिल्कुल समझ में आता है। और वह गलती अक्सर शुरुआती लोगों द्वारा की जाती है।

2

यदि आप % f प्रारूप विनिर्देशक का उपयोग कर रहे हैं, तो आपको डबल के बजाय फ्लोट डेटा प्रकार का उपयोग करना होगा।

0

समस्या है क्योंकि:

  1. या तो चर float होना चाहिए::

    format '%f' expects argument of type 'float*', but argument 2 has type 'double*' 
    

    इस संभाल करने के लिए दो तरीके हैं

    double height = 0; --> float height = 0; 
    double weight = 0; --> float weight = 0; 
    double bmi = 0;  --> float bmi = 0; 
    
  2. या format specifier चाहिए double के अनुरूप है।

    scanf_s("%f", &height); --> scanf_s("%lf", &height); 
    
    scanf_s("%f", &weight); --> scanf_s("%lf", &weight); 
    
    printf("\nYour Body Mass Index stands at %f\n", bmi); 
                  | 
                  V 
    printf("\nYour Body Mass Index stands at %lf\n", bmi); 
    
संबंधित मुद्दे