2011-12-15 18 views
5

यह स्टैक ओवरफ़्लो पर मेरी पहली पोस्ट है, इसलिए मुझे आशा है कि मैं किसी के पैर की उंगलियों पर कदम नहीं उठाऊंगा।के एंड आर: अध्याय 6 - क्यों getword() फ़ंक्शन ईओएफ नहीं पढ़ता है?

बेशक, सभी इनपुट का स्वागत है और सराहना की जाती है, लेकिन उत्तर देने के लिए सबसे उपयुक्त उन लोगों को वास्तव में पुस्तक, सी प्रोग्रामिंग भाषा, दूसरा संस्करण पढ़ा होगा।

मैंने अभी व्यायाम 6-4 कोडिंग समाप्त कर दिया है, लेकिन मुझे कुछ पता लगाना प्रतीत नहीं होता है। Getword() फ़ंक्शन EOF को तब तक नहीं पढ़ता जब तक कि मैं Ctrl + D दबाता हूं (एक आर्क लिनक्स वीएम में सी में कोड)?

पुस्तक से मेरे पिछले अभ्यासों में से कई को stdin से पढ़ने की आवश्यकता है। एक तरह से मैं यह कर की तरह

while ((c = getchar()) != EOF) {...} 

ऐसे मामलों में कुछ के माध्यम से है, मैं Ctrl + D प्रेस करने की आवश्यकता नहीं है। मैं अपने इनपुट में प्रवेश करता हूं, एंटर दबाता हूं, stdin buffer बाहर निकल जाता है, और ईओएफ स्वचालित रूप से पता चला है। Getword() फ़ंक्शन भी getchar() पर अपने आधार पर निर्भर करता है, तो यह मेरे प्रोग्राम को क्यों लटकाता है?

getword() फ़ंक्शन से कहा जाता है मुख्य():

while (getword(word, MAX_WORD) != EOF) { 
    if (isalpha(word[0])) { 
     root = addtree(root, word); 
    } 
} 

getword() फ़ंक्शन में ही:

int getword(char *word, int lim) { 

    char *w = word; 
    int c; 

    while (isspace(c = getch())) { 
    } 
    if (c != EOF) { 
     *w++ = c; 
    } 
    // This point is reached 
    if (!isalpha(c)) { 
     // This point is never reached before Ctrl+D 
     *w = '\0'; 
     return c; 
    } 
    for (; --lim > 0; w++) { 
     if (!isalnum(*w = getch())) { 
      ungetch(*w); 
      break; 
     } 
    } 
    *w = '\0'; 
    return word[0]; 
} 

मैं टिप्पणी नहीं डाल बिंदु मैं कहाँ निर्धारित EOF है कि इंगित करने के लिए पढ़ा नहीं जा रहा है।

getch() और ungetch() फ़ंक्शन एक ही अध्याय 4 से पोलिश संकेतन कैलक्यूलेटर में उपयोग किए जाते हैं (और उस प्रोग्राम स्वचालित रूप से EOF पढ़ने में सक्षम था - दबाकर दर्ज):

#define BUF_SIZE 100 

char buf[BUF_SIZE]; 
int bufp = 0; 

int getch(void) { 

    return (bufp > 0) ? buf[--bufp] : getchar(); 
} 

void ungetch(int c) { 

    if (bufp >= BUF_SIZE) { 
     printf("ungetch: too many characters\n"); 
    } 
    else { 
     buf[bufp++] = c; 
    } 
} 

इस प्रकार अब तक, यह पहला कार्यक्रम है जिसे मैंने इस पुस्तक की शुरुआत के बाद लिखा था जिसके लिए मुझे मैन्युअल रूप से Ctrl + D के माध्यम से EOF दर्ज करना आवश्यक है। मुझे लगता है कि क्यों नहीं लग रहा है। स्पष्टीकरण के लिए पहले से

बहुत सराहना ...

+0

कोड प्रारूपित करने के लिए, इसे हाइलाइट करें और '{} 'आइकन पर क्लिक करें। यह 4 रिक्त स्थान पर हाइलाइट किए गए क्षेत्र को इंडेंट करता है, इस प्रकार "मार्कडाउन" स्रोत कोड इंगित करता है। यह भी देखें [संपादन सहायता पृष्ठ] (http://stackoverflow.com/editing-help)। मैंने इसे आपके लिए तय कर लिया है। और Stackoverflow में आपका स्वागत है! –

उत्तर

3

ईओएफ प्राप्त करने के लिए Ctrl + D टाइप करने के लिए यूनिक्स-जैसी प्रणालियों के लिए सामान्य व्यवहार है।

अपने कोड स्निपेट के लिए:

while ((c = getchar()) != EOF) {...} 

दबाने दर्ज निश्चित रूप से पाश समाप्त नहीं करना चाहिए (जब तक अपने tty सेटिंग्स बुरी तरह से अव्यवस्थित हैं)।

संकलन और इस कार्यक्रम चलाने की कोशिश करें:

#include <stdio.h> 
int main(void) 
{ 
    int c; 
    while ((c = getchar()) != EOF) { 
     putchar(c); 
    } 
    return 0; 
} 

यह भी आप टाइप प्रिंट चाहिए, और यह केवल समाप्त जब आप एक पंक्ति के आरंभ में नियंत्रण-डी टाइप करना चाहिए (या जब आप नियंत्रण के साथ यह मारने -सी)।

+0

या जब आप एक पंक्ति में दो नियंत्रण-डी टाइप करते हैं। या जब आप इसे 'छोड़ें' सिग्नल के साथ मार देते हैं। : डी –

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने अपना कोड दोबारा जांच लिया, और आप सही हैं। जब मैं एंटर दबाता हूं, तो एसडीटीन बफर स्क्रीन पर फिसल जाता है, लेकिन जब तक मैं Ctrl-D या Ctrl-C दबाता हूं तब तक EOF का कभी सामना नहीं होता है। मैंने किसी भी तरह से '\ n' के साथ ईओएफ को भ्रमित कर दिया। –

2

यदि आप प्रकार की तरह कुछ इनपुट में विराम चिह्न किया 'तक पहुँच नहीं' बिंदु केवल पहुँचा जा होगा - या आप EOF पढ़ें। यदि आप एक अक्षर, या रिक्त स्थान टाइप करते हैं, तो यह बाईपास किया जाता है।

जब इनपुट एक टर्मिनल (मानक इनपुट), तो EOF नहीं पाई गई है आ रहा है जब तक आप टाइप नियंत्रण-डी (या जो भी stty -a उत्पादन में निर्दिष्ट किया जाता है), या के बाद आप एक नई पंक्ति दर्ज करने के बाद आप एक और हिट नियंत्रण-डी (इसलिए एक पंक्ति में दो)। कोड न्यूलाइन के माध्यम से पढ़ता है क्योंकि न्यूलाइन कैरेक्टर '\n'isspace() को संतुष्ट करता है।

+0

आप भी सही हैं, महोदय, एक गैर-वर्णमाला इनपुट करना उस बिंदु तक पहुंच जाएगा जो मैंने संकेत दिया है कि नियंत्रण-डी से पहले कभी नहीं पहुंचाया जाएगा। मैं केवल शब्द पेड़ के संदर्भ में शब्दों के बारे में सोच रहा था। –

0

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

मुझे सीधे सेट करने के लिए धन्यवाद!