2013-02-27 246 views
11

पर सीमा मैं K & आर से "The C Programming Language" पुस्तक सीख रहा हूं। मैं पुस्तक में निर्दिष्ट अभ्यास कर रहा हूं। मैं अभ्यास संख्या 1.16 पर हूं, लेकिन मुझे समझ में नहीं आता है।के एंड आर व्यायाम 1.16 - लाइन लंबाई

व्यायाम 1.16:

संशोधन सबसे लंबे समय तक लाइन कार्यक्रम तो यह सही ढंग से मनमाने ढंग से लंबे समय से इनपुट लाइनों की लंबाई प्रिंट होगा की मुख्य दिनचर्या, और पाठ का यथासंभव ज्यादा।

मेरे सवालों का:

  1. "... पाठ का जितना संभव हो उतना ..." - वहाँ स्ट्रिंग की लंबाई पर कुछ सीमा है? हो सकता है कि मानक हेडर में स्ट्रिंग लम्बाई के अधिकतम अनुमत मान वाले चर हो?

  2. "... मनमाने ढंग से लंबी इनपुट लाइनों की लंबाई ..." - लेकिन कोड में MAXLINE को 1000 के रूप में परिभाषित किया गया है। यह सीमित आकार भी है। मुझे कुछ समाधान here दिखाई देते हैं, लेकिन मेरी राय में यह समाधान निर्णय नहीं है, क्योंकि पूर्व में एक रेखा (1000 वर्ण) की लंबाई पर प्रतिबंध है।

शायद मुझे यह कार्य समझ में नहीं आया। मेरी समझ है कि मुझे 1000-वर्ण सीमा को हटाना होगा।

+1

मेरे पास अब मेरे साथ मेरे के एंड आर नहीं है, इसलिए मैं वास्तव में सबसे लंबे समय तक कार्यक्रम की आवश्यकताओं की जांच नहीं कर सकता। याद रखें, हालांकि, आप एकल अक्षरों को पढ़ सकते हैं, प्रिंट कर सकते हैं और उन्हें स्ट्रिंग में सहेजने की आवश्यकता नहीं है। – pmg

+0

@pmg लेकिन कार्य के पाठ के अनुसार, मुझे अधिकतम लाइन टेक्स्ट भी प्रिंट करना होगा और प्रिंट करना होगा। –

+0

अच्छा ... अगर आपको सबसे लंबी लाइन मुद्रित करनी है, तो आपको इसे कहीं सेव करना होगा। मेरा सुझाव व्यायाम के लिए अच्छा नहीं है, क्षमा करें। – pmg

उत्तर

12

यह कश्मीर & आर में एक सुंदर जल्दी व्यायाम है, तो आप सिर्फ कोड, नहीं कोड के कुल को नया स्वरूप के लिए कुछ मामूली परिवर्तन करना चाहिए रहे हैं।

  1. "... पाठ का जितना संभव हो उतना ..."

    आप पर निर्भर व्याख्या करने के लिए है। मैं इसे longest बफर में संग्रहीत करने के द्वारा प्रिंट करके करूँगा। यानी लाइन के 1000 अक्षर तक प्रिंट करें। फिर, यह एक प्रारंभिक अभ्यास है, अभी तक गतिशील आवंटित स्मृति के लिए थोड़ा परिचय के साथ। और उस समय के & आर लिखा गया था, मनमाने ढंग से लंबी टेक्स्ट लाइनों को दूर करना उतना संभव नहीं था जितना आज है।

  2. "... मनमाने ढंग से लंबे समय से इनपुट लाइनों की लंबाई ..."

    एक कठिन आवश्यकता है। आपको सही लंबाई मिलनी चाहिए चाहे कितनी देर हो (कम से कम int की सीमाओं के भीतर।एक नई पंक्ति ('\ n')

    • getline() करने के लिए कॉल के बाद, यदि अंतिम वर्ण line बफर में पढ़ जाँच कर रहा है:) इस समस्या को हल करने के लिए

एक ही रास्ता है

  • यदि यह है, तो आप एक पूरी लाइन पढ़ते हैं। len वैरिएबल लाइन की सही लंबाई (गेटलाइन() का रिटर्न वैल्यू है, और मूल कोड की तुलना में कोई विशेष विचार की आवश्यकता नहीं है।
  • यदि यह नहीं है, तो आपने पूरी लाइन नहीं पढ़ी है, और इस लाइन के अंत के लिए शिकार करने की आवश्यकता है। आप थोड़ी देर लूप जोड़ते हैं, जब तक यह एक नई लाइन (या ईओएफ) नहीं लौटाता है, और उस लूप में पढ़ने वाले अक्षरों की संख्या को गिनें। बस len++ गिनने के लिए करें।
  • जब लूप लूप किया जाता है, तो नया len अब लाइन की वास्तविक लंबाई है, लेकिन हमारे बफर के पास पहले 999 वर्ण हैं।
  • पहले की तरह, आप स्टोर (कॉपी() फ़ंक्शन कॉल) वर्तमान line बफर (अधिकतम 1000 वर्ण) यदि यह रेखा अब तक का सबसे लंबा है।
  • जब आप पूरा कर लेंगे, तो आप संग्रहीत लाइन को पहले (longest बफर) और max लंबाई के लिए चर के रूप में प्रिंट करें।
    • उपरोक्त उल्लिखित होने के कारण max लंबाई अब सही है।
    • यदि longest लाइन वास्तव में 1000 वर्णों से अधिक थी। आप कम से कम उन 999 वर्णों को प्रिंट करें - जो "जितना संभव हो" है।
  • मैं इसे खराब कर देंगे नहीं और कोड आप इस पूरा करने की आवश्यकता पोस्ट, लेकिन यह कोड की सिर्फ 6 लाइनों है कि आप व्यायाम 1-16 की सबसे लंबी लाइन कार्यक्रम में जोड़ने की जरूरत है।

    +0

    धन्यवाद। मैं इसे रूसी में अनुवाद करने और कल कोड लिखने की कोशिश करूंगा। अब रात है, और मैं सोना चाहता हूँ। सभी को धन्यवाद! –

    1
    1. आधुनिक मशीनों पर "जितना संभव हो सके पाठ" सभी पाठ होने की संभावना है, टर्मिनल प्रोग्राम स्वचालित रूप से लाइन-रैपिंग के लिए धन्यवाद। उस पुस्तक को लिखा गया था जब टेलीटाइप टर्मिनल अभी भी उपयोग में थे। जिस मशीन पर आप काम कर रहे हैं उसकी स्मृति सीमाओं के अलावा स्ट्रिंग लम्बाई पर कोई सीमा नहीं है।

    2. वे उम्मीद कर रहे हैं कि आप अक्षरों को पढ़ने के लिए किसी प्रकार का पाश जोड़ने और MAXLINE आकार के बफर में पढ़ने के लिए सुनिश्चित करने के बजाय न्यूलाइन की तलाश कर रहे हैं।

    +0

    मुझे कहीं याद है कि लिनक्स पर पाठ फ़ाइल में प्रति पंक्ति '4096' चार सीमा है। यह अब उससे परे समर्थित है? कब से? – SparKot

    +0

    'स्वचालित रूप से लाइन-रैपिंग टर्मिनल प्रोग्राम' - यह क्या है? –

    +1

    @DoSparKot, इसे आज़माएं - मुझे यकीन है कि आप देखेंगे कि ऐसी कोई सीमा नहीं है। मैंने कभी ऐसी बात नहीं सुनी है। –