2011-01-26 14 views
7

मुझे एक सी फ़ंक्शन की आवश्यकता है जो स्वरूपित स्ट्रिंग की अंतिम लंबाई देता है ताकि मैं लंबाई की गणना करने के बजाय लक्ष्य स्ट्रिंग को सही ढंग से आवंटित कर सकूं। snprintf है जो पूरी स्ट्रिंग को लिखने में असमर्थता पर ही करता है, लेकिन दुर्भाग्यवश इसके लिए कोई विस्तृत चार विकल्प नहीं है।क्या asprintf के लिए wchar_t संस्करण है?

swprintf रिटर्न -1 गलती की स्थिति में, नहीं की जरूरत लंबाई (क्यों नहीं एक ही व्यवहार?!?)

शीर्षक उल्लेख asprintf, यह भी कोई मदद नहीं की जा करने के लिए के रूप में यह एक गैर व्यापक प्रदान करता है लगता है केवल संस्करण।

_vscwprintf विंडोज़ पर इस्तेमाल किया जा सकता है, लेकिन मुझे एक क्रॉसप्लेटफार्म, मानक संस्करण, या कम से कम एक लिनक्स संस्करण की आवश्यकता है और मैं कोड #ifdef होगा।

कोई विचार? धन्यवाद!

उत्तर

3

POSIX 2008 ने open_wmemstream फ़ंक्शन जोड़ा जो vfwprintf के साथ, आपको वही करता है जो आपको चाहिए। यह पहले एक जीएनयू विस्तार था, इसलिए यह लंबे समय तक जीएनयू सिस्टम पर उपलब्ध है।

इसका उपयोग आसानी से awprintf रैपर बनाने के लिए किया जा सकता है।

+1

बहुत बहुत धन्यवाद। यह हैक अच्छा है और यह वास्तव में काम करता है। मुझे अभी भी समझ में नहीं आता है कि 'awprintf' जैसी चीजें इतनी सरल क्यों होती हैं जब इसे अधिक जटिल सुविधाएं जोड़ दी जाती हैं। – gheorghe1800

+0

शायद क्योंकि प्रश्न में मानक पॉज़िक्स है और लगभग कोई भी पॉज़िक्स सिस्टम के लिए कोडिंग नहीं करता है, तब उन्हें 'wchar_t' का उपयोग करता है जब उन्हें ... –

2

ठीक है, आपकी अपेक्षाओं में एक मौलिक दोष लगता है। इन को जोड़ने:

  1. विंडोज आप क्या चाहते हैं
  2. लिनक्स है एक गैर विस्तृत विविधता (asprintf किसी भी मानक में नहीं है, लेकिन विशुद्ध रूप से लिनक्स और * बीएसडी के लिए एक जीएनयू विस्तार) है।
  3. POSIX एक शून्य-समाप्त char* सरणी के रूप में संबंधित सभी स्ट्रिंग/फ़ाइल को परिभाषित करता है, जो कि किसी भी POSIX फ़ंक्शन के विस्तृत संस्करणों की कमी को समझाता है।
  4. 2, 3, और 4 के शीर्ष पर, सभी आधुनिक लिनक्स डिस्ट्रोज़ यूटीएफ -8 आधारित हैं, जिसका अर्थ है कि गैर-व्यापक संस्करण "उपयोग किए जाने के लिए" हैं।

इन्हें जोड़ना देता है: आपको ऐसा कुछ क्यों चाहिए? निश्चित रूप से आप यूनिक्स पर wchar_t एस का उपयोग नहीं कर रहे हैं, आप ;) हैं। यदि आप हैं, तो अभी भी दो विकल्प हैं: tchar-जैसे समाधान (प्लेटफ़ॉर्म आश्रित टाइपिफ़) पर स्विच करें या पूरी तरह से यूटीएफ -8 पर स्विच करें।

+0

उत्तर के लिए धन्यवाद। हां, मुझे थोड़े से wchar_t का उपयोग करना होगा और यूटीएफ -8 में स्विच करना बहुत महंगा हो सकता है। – gheorghe1800

+0

@ gheorghe1800: स्क्रैप wchar_t और उपयोग [यूटीएफ -8] (http://utf8everywhere.org/)। यदि आप इसका पालन करते थे, तो यह सवाल उठता नहीं होता। – ybungalobill

3

हां, swprintf। ध्यान दें कि इसके नाम के बावजूद, swprintfsnprintf, sprintf पर विस्तृत वर्ण समकक्ष है, जिसमें यह एक दूसरे आकार के रूप में बफर आकार लेता है; वहां (सौभाग्य से) कोई विस्तृत चरित्र संस्करण नहीं है जो बफर आकार नहीं लेता है।

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

+0

धन्यवाद। मैंने पहले ही यही सोचा था, मैंने आशा की थी कि पहले से ही एक बेहतर समाधान लागू किया गया है।अंत में, मुझे लगता है कि मुझे लंबाई की गणना करना होगा, जो सामान्य मामले पर त्रुटि प्रवण होता है, लेकिन मैं पूरी तरह से सुनिश्चित करना सुनिश्चित करूंगा। – gheorghe1800

+0

एक बेहतर तरीका है; मेरा जवाब देखें आप प्री-पॉज़िक्स -2008 सिस्टम के लिए एडम के समाधान में फॉलबैक करना चाहेंगे। –

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