सी

2011-11-17 12 views
15

में लंबाई को पार करने वाले चार का एक बफर प्रिंट करें मेरे पास एक सीरियल पोर्ट के माध्यम से एक बफर है। जब मुझे एक निश्चित कैरेक्टर मिलता है, तो मुझे पता है कि एक पूर्ण लाइन आ गई है, और मैं इसे printf विधि से प्रिंट करना चाहता हूं। लेकिन प्रत्येक पंक्ति एक भिन्न लंबाई महत्व है, और जब मैं सिर्फ साथ जाना:सी

printf("%s", buffer); 

मैं रेखा के साथ साथ पूर्व लाइन से संबंधित अतिरिक्त वर्ण मुद्रण कर रहा हूँ (अगर यह मौजूदा एक से अधिक समय था)।

मैं here कि यह संभव है, कम से कम सी ++ में, यह बताने के लिए कितना वर्ण आप एक %s दिया पढ़ना चाहते हैं पढ़ा है, लेकिन यह कोई उदाहरण है और मैं कैसे सी में यह करने के लिए किसी भी मदद नहीं जानते ?

संपादित करें: बिल्कुल सही। तो मैं तीन समाधान है: - चार से मुद्रण चार एक for पाश साथ - समाप्ति चरित्र का उपयोग कर - या का उपयोग कर *

सवाल यह है:। कौन सा तेज है? क्योंकि मैं माइक्रोचिप पीआईसी पर काम कर रहा हूं और मैं इसे जितनी जल्दी हो सके

+2

आपको लगता है कि * "निश्चित चरित्र" * प्राप्त हो गया है और 'buffer' करने के लिए इसे संलग्न किया है, एक अशक्त चरित्र संलग्न (' \ 0') के रूप में अच्छी तरह से। प्रिंटिंग वर्णों को रोकने के लिए यह "sprintf()' बताता है। –

उत्तर

22

आपके पास स्ट्रिंग को शून्य-समाप्त नहीं किया गया है, इसलिए printf (और कोई अन्य सी स्ट्रिंग फ़ंक्शन) इसकी लंबाई निर्धारित नहीं कर सकता है, इस प्रकार यह तब तक वर्णित वर्णों को लिखना जारी रखेगा जब तक कि वहां न होने वाले शून्य चरित्र पर ठोकर न हो। stdout से अधिक

  • उपयोग fwrite:

    आपकी समस्या को आप या तो हल करने के लिए

    fwrite(buffer, buffer_length, 1, stdout); 
    

    यह काम करता है क्योंकि fwrite मुद्रण सिर्फ स्ट्रिंग्स के लिए सोचा नहीं है, लेकिन डेटा के किसी भी प्रकार है, तो यह एक निरंतर शून्य चरित्र की तलाश नहीं करता है, लेकिन पैरामीटर के रूप में लिखा जाने वाला डेटा की लंबाई स्वीकार करता है;

  • अपने बफर प्रिंट करने से पहले मैन्युअल रूप से अशक्त-समाप्त: आप buffer से अधिक किसी भी अन्य स्ट्रिंग प्रसंस्करण क्या करना है अगर

    buffer[buffer_length]=0; 
    printf("%s", buffer); /* or, slightly more efficient: fputs(buffer, stdout); */ 
    

    यह एक बेहतर विचार हो सकता है, कि अब अशक्त-समाप्त और इतने से प्रबंधनीय हो जाएगा सामान्य सी स्ट्रिंग प्रसंस्करण कार्यों।

+0

मुझे आश्चर्य है कि इस SO प्रश्न के डुप्लिकेट के जवाब में इस विधि को शामिल नहीं किया गया है, लेकिन केवल 'लूप' के लिए सुझाव है ... – Alex

1

एक बार जब आप पंक्ति के अंत की पहचान की है, तो आप इसे printf को भेजने से पहले बफर के अंत में एक '\0' चरित्र संलग्न करना होगा।

+0

कोई भी जो डाउनवॉटेड है, उसे समझा देना चाहता हूं कि मैं अपना जवाब क्यों सुधार सकता हूं? –

+0

आपको यह कहना चाहिए कि ओपी ने क्या किया है, इसे ठीक करने के तरीके के अलावा। – Alex

37

आप अपने समापन चरित्र के बाद एक अशक्त चरित्र जोड़ने या तो कर सकते हैं, और अपने printf काम करेंगे, या आप अपने printf बयान में एक '.*' जोड़ सकते हैं और लंबाई

printf("%.*s",len,buf); 

सी में प्रदान ++ आप शायद इस तरह के बजाय std :: स्ट्रिंग और std :: अदालत का उपयोग करेंगे:

std::cout << std::string(buf,len); 

सब तुम चाहते हो सबसे तेजी से गति और कोई स्वरूपण है - तो का उपयोग

fwrite(buf,1,len,stdout); 
+0

अच्छा, यह – Ben

+0

बिल्कुल नहीं पता था। तो मेरे पास तीन समाधान हैं: लूप के साथ char द्वारा प्रिंटिंग char, समाप्ति चरित्र का उपयोग करके, या उपयोग कर रहा है। * प्रश्न है: कौन सा तेज़ है? क्योंकि मैं माइक्रोचिप पीआईसी पर काम कर रहा हूं और मैं चाहता हूं कि यह तेजी से –

+0

@RomanRdgz: मेरा अनुमान: 'fwrite' या null-termination +' fputs' सबसे तेज़ होना चाहिए, इसके बाद शून्य-समाप्ति + 'printf' (धीमा हो सकता है) क्योंकि इसे प्रारूप स्ट्रिंग को पार्स करना पड़ सकता है, जब तक कि संकलक बहुत स्मार्ट न हो) फिर '। *' के साथ 'printf' (निश्चित रूप से प्रारूप स्ट्रिंग को पार्स करने की आवश्यकता होती है) और आखिरी प्रिंटिंग चार char (शायद सबसे धीमी, सभी के कारण फ़ंक्शन कॉल - हालांकि इनलाइन किया जा सकता है)। –

3

आप अंतिम वर्ण प्राप्त करने के बाद बफर में एक NUL (0x0) डाल सकते हैं।

buffer[i] = 0;