2010-04-08 15 views
13

कॉलेज के लिए असाइनमेंट में इसे अभ्यास में C readline फ़ंक्शन का उपयोग करने का सुझाव दिया गया था। मैंने इसके संदर्भ की खोज की है लेकिन अभी भी इसे नहीं मिला है। क्या यह वास्तव में मौजूद है? किस हेडर में? क्या आप संदर्भ में लिंक पोस्ट कर सकते हैं?सी रीडलाइन फ़ंक्शन

उत्तर

15

ReadLine दो स्थानों, libreadline और libedit (भी libeditline कहा जाता है) में मौजूद है। दोनों में एक समान इंटरफ़ेस है। अंतर यह है कि libreadline जीपीएल के तहत लाइसेंस प्राप्त है, libedit 3 खंड बीएसडी है। लाइसेंसिंग वास्तव में असाइनमेंट की चिंता नहीं है, कम से कम मुझे नहीं लगता कि यह है। या तो लाइसेंस आपको कोड को स्वतंत्र रूप से उपयोग करने की अनुमति देता है। यदि आप रीडलाइन के खिलाफ लिंक करते हैं, तो पूरे कार्यक्रम को GPL 2 or later बनाना सुनिश्चित करें जो जीपीएल के किसी भी संस्करण को सिस्टम readline पर नियंत्रित करेगा। यह सिस्टम की उम्र के आधार पर जीपीएल 2 + या जीपीएल 3 + हो सकता है। मैं या तो लाइसेंस की वकालत नहीं कर रहा हूं, यह आपके ऊपर है।

ध्यान दें, स्थापित या तो/या करने के लिए ध्यान रखना है और आवश्यकतानुसार (-lreadlineया-leditया-leditline) जोड़ने समायोजित करें। दोनों पुस्तकालय हैं और मानक सी पुस्तकालय का हिस्सा नहीं हैं।

संपादित (बाद का विचार):

तो जंगली के लिए एक कार्यक्रम जारी है, इसकी एक अच्छा इशारा उपयोगकर्ता पसंद के उनके readline के साथ इसे कॉन्फ़िगर करने की अनुमति। उदाहरण के लिए: --with-readline या --with-libedit, आदि। यह एक बाइनरी पैकेज की अनुमति देता है जो लाइसेंस की अपनी पसंद के अनुरूप है, कम से कम readline संबंधित है।

लिंक: Readline और Edit/Editline

+3

जिसका अर्थ है, आप 'libedit' कारण बीएसडी नियम चाहते हैं। : पी – Earlz

+0

हां, मैंने 'libedit' अवतार को कुछ सिस्टमों से अधिक' libeditline' के रूप में देखा है, हालांकि मुझे याद नहीं है कि वे इस समय क्या थे। –

+0

यह भी ध्यान दें, मैंने लाइसेंस से लिंक नहीं किया है। आपके द्वारा उपयोग किए जाने वाले संस्करण के आधार पर रीडलाइन जीपीएल 2-या-बाद में या जीपीएल 3 हो सकती है, हालांकि 3 खंड बीएसडी लाइसेंस स्थिर रहता है। –

-5

यह अस्तित्व में नहीं है।

वे गलत थे और stdio.h से() को संदर्भित किया गया था।

यह पैरामीटर पढ़ने के लिए अधिकतम आकार के कारण भी एक बहुत ही असुरक्षित कार्य है, जिससे इसे तत्काल सुरक्षा पूरी हो जाती है (लुकअप बफर ओवररन हमला)। आप इसके बजाय fgets() का उपयोग कर सकते हैं, जैसे नीचे दी गई गुस्से में टिप्पणियां।

+11

नहीं, ** ** ** 'प्राप्त 'का उपयोग न करें! –

+0

@ जेरी +1 ... क्या आप fgets का उपयोग करने की सलाह देते हैं? – LB40

+3

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

3

मुझे नहीं लगता कि यह एक मानक कार्य है।

मैं सरल कार्यान्वयन इस तरह होगा:

char *Readline(char *in) { 
    char *cptr; 

    if (cptr = fgets(in, MAX_LINE, stdin)) { 
    /* kill preceding whitespace but leave \n so we're guaranteed to have something 
    while(*cptr == ' ' || *cptr == '\t') { 
     cptr++; 
    } 
    return cptr;  
    } else { 
    return 0; 
    } 
}

यह fgets() का उपयोग करता है MAX_LINE अप करने के लिए पढ़ने के लिए - 'में' बफर में 1 अक्षर। यह व्हाइटस्पेस से पहले स्ट्रिप्स करता है और पहले गैर-व्हाइटस्पेस चरित्र में पॉइंटर देता है।

+5

रीडलाइन() एक कमांड इतिहास, टैब पूर्णता, सरल रेखा संपादन, आदि प्रदान करता है। यह एक बाहरी लेकिन जंगली लोकप्रिय पुस्तकालय है। –

+1

@Tim: आप सही हैं, रीडलाइन लाइब्रेरी ऐसा करता है, लेकिन मुझे लगता है कि वह केवल एक सीआर चार सरणी के रूप में एक रेखा को पढ़ने के लिए चाहता है। – yassin

+3

मुझे लगता है कि वह पुस्तकालयों के लिंक चाहता था। –

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