2013-01-23 31 views
8

मैं कक्षा के लिए एक सरल सी प्रोग्राम बनाने की कोशिश कर रहा हूं और आवश्यकताओं में से एक यह है कि मुझे सभी इनपुट और आउटपुट के लिए scanf/printf का उपयोग करने की आवश्यकता है। मेरा सवाल यह है कि यह क्यों है कि मेरे scanf मुख्य में लूप के बाद छोड़ दिया जाता है और प्रोग्राम बस समाप्त हो जाता है।स्कैनफ प्राप्त हो रहा है

यहाँ मेरी कोड

#include <stdio.h> 

void main() { 
    int userValue; 
    int x; 
    char c; 

    printf("Enter a number : "); 
    scanf("%d", &userValue); 
    printf("The odd prime values are:\n"); 
    for (x = 3; x <= userValue; x = x + 2) { 
     int a; 
     a = isPrime(x); 
     if (a = 1) { 
      printf("%d is an odd prime\n", x); 
     } 
    } 
    printf("hit anything to terminate..."); 
    scanf("%c", &c);  
} 

int isPrime(int number) { 
    int i; 
    for (i = 2; i < number; i++) { 
     if (number % i == 0 && i != number) 
      return 0; 
    } 
    return 1; 
} 

मैं पहले एक के बाद एक और समान scanf जोड़कर "ठीक" करने में सक्षम था, लेकिन मैं सिर्फ एक का उपयोग करना पसंद करेंगे।

+1

क्या आपने 'सिस्टम (" PAUSE ") की कोशिश की है;'? –

+0

क्या सीधी सी या केवल सी ++ में उपलब्ध है? –

+0

स्टाइट सी। नामस्थान की कमी पर ध्यान दें? –

उत्तर

19

पिछले int के बाद stdin में मौजूद नया-रेखा वर्ण scanf() पर अंतिम कॉल द्वारा उपभोग नहीं किया गया होगा। तो scanf() पर for लूप के बाद कॉल नए-पंक्ति चरित्र का उपभोग करता है और उपयोगकर्ता को कुछ भी दर्ज करने के बिना जारी रहता है।

एक और scanf() कॉल आप for पाश के बाद scanf() में फॉर्मेट स्पेसिफायर " %c" इस्तेमाल कर सकते हैं जोड़ने के लिए बिना सही करने के लिए। यह scanf() किसी भी अग्रणी व्हाइटस्पेस वर्ण (नई लाइन सहित) को छोड़ देगा। ध्यान दें कि इसका मतलब है कि उपयोगकर्ता को प्रोग्राम को समाप्त करने के लिए एक नई लाइन के अलावा कुछ और दर्ज करना होगा।

इसके अतिरिक्त:

  • जांच scanf() का परिणाम सुनिश्चित करने के लिए यह वास्तव में चर में पारित करने के लिए एक मूल्य प्रदान करती है:

    /* scanf() returns number of assigments made. */ 
    if (scanf("%d", &userValue) == 1) 
    
  • इस एक काम है (और हमेशा सच हो जाएगा) :

    if (a = 1){ /* Use == for equality check. 
           Note 'a' could be removed entirely and 
           replace with: if (isPrime(x)) */ 
    
+1

'scanf() 'के अंतिम कॉल द्वारा इसका उपभोग क्यों नहीं किया जाएगा? क्षमा करें newb सवाल –

+2

@SSHThis, 'scanf ("% d")' कुछ ऐसा नहीं होता है जब कोई अंक नहीं होता है, और एक नई रेखा एक अंक नहीं है, इसलिए यह रहेगी। – hmjd

+0

उस गलती को पकड़ने के लिए धन्यवाद –

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