2010-03-09 7 views
16

के बारे में उलझन में मैं निम्नलिखित कोड में getchar() की भूमिका के बारे में उलझन में हूं। मेरा मतलब है कि मुझे पता है कि यह मुझे आउटपुट विंडो देखने में मदद कर रहा है जो केवल दबाएं जब कुंजी दर्ज करें।getchar() फ़ंक्शन

तो getchar() मूल रूप से मेरे लिए प्रवेश करने के लिए प्रतीक्षा कर रहा है और फिर एक वर्ण पढ़ता है।

यह फ़ंक्शन यह कार्य क्या पढ़ रहा है? मैंने इसे पढ़ने के लिए कीबोर्ड से कोई भी कुंजी नहीं दबाई।

अब जब यह कुछ भी नहीं पढ़ रहा है, तो यह क्यों कहता है कि "हे, आपने मेरे पढ़ने के लिए कुछ भी नहीं डाला"?

#include <stdio.h> 

int main() 
{ 
    printf("blah \n"); 
    getchar(); 
    return 0; 
} 
+2

getchar() एक कुंजी दबाए जाने तक अनिश्चित काल तक प्रतीक्षा रखेगा। यह आपका नौकर है। –

+4

स्टैक ओवरफ्लो में आपका स्वागत है! न्यूबी प्रश्न यहां पूरी तरह से ठीक हैं, जब तक वे अन्यथा विषय पर हैं। आपका वास्तव में एक अच्छा सवाल है, क्योंकि यह एक महत्वपूर्ण अवधारणा को संबोधित करता है। – sleske

+1

कृपया अपने शीर्षक को प्रश्न के विषय के करीब रखने का प्रयास करें, इससे दूसरों की मदद मिलेगी जो कुछ इसी तरह की खोज कर रहे हैं। मैंने प्रश्न को प्रतिबिंबित करने के लिए अपना शीर्षक संपादित कर लिया है। स्टैक ओवरफ़्लो में आपका स्वागत है :) –

उत्तर

8

getchar() फ़ंक्शन बस तब तक प्रतीक्षा करेगा जब तक कि यह एक चरित्र प्राप्त न हो जाए, जब तक कि यह प्रोग्राम तक न हो जाए।

जब आप एंटर कुंजी दबाते हैं तो एक वर्ण भेजा जाता है; एक विंडोज ओएस के तहत, यह एक कैरिज रिटर्न (सीआर) और एक लाइन फीड (एलएफ) भेज देगा।

अच्छी तरह से स्पष्टीकरण के लिए this CodingHorror post देखें।

(... सीआर + वामो हिस्सा है, नहीं getchar() अवरुद्ध भाग की व्याख्या)

+0

लिंक पोस्ट करने के लिए धन्यवाद। –

11

ऐसा इसलिए है क्योंकि getchar() एक समारोह अवरुद्ध है।

आपको blocking functions के बारे में पढ़ना चाहिए, जो मूल रूप से प्रक्रिया को बनाने के लिए प्रतीक्षा करें।

का कार्यान्वयन व्यवहार कार्य पर निर्भर करता है, लेकिन आम तौर पर यह एक लूप है जो कुछ घटना होने की प्रतीक्षा करता है।

getchar() फ़ंक्शन के मामले में, यह संभवतः एक लूप के रूप में कार्यान्वित किया जाता है जो लगातार एक फ़ाइल (इस मामले के लिए stdin) पढ़ता है और फ़ाइल को संशोधित करता है। अगर फ़ाइल संशोधित की जाती है, तो लूप कुछ और कर कर व्यवहार करता है।

+0

मुझे लगता है कि मैं उन पर भी पढ़ूंगा। क्या वह (उपयोगकर्ता के विवरण के आधार पर) एक ईवेंट श्रोता या एक बाधा की तरह अधिक है (या न तो और मैं बेवकूफ सवालों के साथ एक हूँ)? – Anthony

+0

@ एंथनी: आंतरिक कार्यान्वयन अलग-अलग होता है: जब आप सीधे एचडब्ल्यू तक पहुंचते हैं (जैसे सीरियल पोर्ट से पढ़ने में), यह आमतौर पर बाधित हो जाएगा। यदि आप एक जीयूआई पर्यावरण में कंसोल विंडो से पढ़ रहे हैं, तो गेटर को शायद जीयूआई ढांचे से कुछ प्रकार का कार्यक्रम प्राप्त होगा। – sleske

2

getchar() एक कुंजी दबाए जाने तक आपके प्रोग्राम के निष्पादन को अवरुद्ध करता है। इसलिए, कोई कुंजी दबाए जाने पर कोई त्रुटि नहीं है, getchar() इसके होने का इंतजार करेगा :)

4

इस प्रयास करें:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char ch; 

    printf("I'm now going to block until you press something and then return... "); 

    ch = getchar(); 

    if (ch >= 0) 
     printf("\nYou pressed %c\n", ch); 
    else 
     printf("\nAliens have taken over standard input! Run!\n"); 

    return 0; 
} 

getchar() जाने के लिए अपने कार्यक्रम के कारण एक ke तक सोने के लिए होगा yboard (या जो भी stdin से जुड़ा हुआ है) अंतराल प्राप्त होता है। इसका मतलब है कि यह अवरुद्ध है, getchar() रिटर्न तक कोई अतिरिक्त कोड निष्पादित नहीं होगा।

यह समझने के लिए वापसी मूल्य पर वापस देखने के लिए बहुत उपयोगी है।

कोई भी कार्य अवरुद्ध हो सकता है, जब तक कि यह अवरोध को रोकने के लिए कुछ तंत्र प्रदान न करे।उदाहरण के लिए, open()O_NONBLOCK ध्वज की अनुमति देता है जो मॉडेम जैसे उपकरणों को प्रतिक्रिया देने में धीमी गति से खोलने में सहायक होता है। संक्षेप में, अगर इसे टर्मिनल से इनपुट मिलता है या कर्नेल या किसी डिवाइस से कोई जवाब पाने के लिए इंतजार करना पड़ता है, तो यह बहुत अच्छा मौका हो सकता है कि यह अवरुद्ध हो सकता है।

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