2013-08-30 5 views
9

printf और scanf परिवारों, कि मौलिक डेटा प्रकार – int के लिए %d, unsigned long long int के लिए %llu के अनुरूप आदिम स्वरूप विनिर्देशक के एक मुट्ठी भर, आदिक्या printf/scanf के लिए Posix आपूर्ति प्रारूप स्ट्रिंग मैक्रोज़ है? सी में कार्यों की

उपभोग हालांकि मानकीकृत प्रकार की एक बड़ी संख्या देखते हैं उपनाम जो अभ्यास में उपयोग करना चाहते हैं, जैसे int32fast_t, और कोई अंतर्निहित मौलिक प्रकार को नहीं जानना चाहिए और उसे नहीं जानना चाहिए। stdint.h में उपनामों के लिए, सी मानक inttypes.h में PRI32 जैसे संबंधित प्रारूप तार उत्पन्न करने के लिए मैक्रोज़ का एक सेट धन्यवाद देता है।

क्या पॉज़िक्स के लिए मैक्रोज़ का एक समान सेट है? पॉज़िक्स में ssize_t, pid_t, rlim_t, suseconds_t, आदि जैसे कई प्रकार के अपारदर्शी प्रकार हैं, जो बुनियादी अंतरंग प्रकारों पर सभी भिन्नताएं हैं। फॉर्मेट स्ट्रिंग्स में एक प्रकार का पोर्टेबल रूप से इसका उपयोग कैसे किया जा सकता है?

+2

यदि सब कुछ विफल हो जाता है, तो आप हमेशा '(u) intmax_t' में परिवर्तित कर सकते हैं और – Christoph

+0

प्रिंट कर सकते हैं दिलचस्प कामकाज - मैंने कभी सोचा नहीं: -S –

+0

(हालांकि पीछे की ओर जाना, यानी 'स्कैनफ़'', मुझे करना होगा मैन्युअल ओवरफ्लो चेक करें और सटीक रूप से तुलना करने के लिए पता लगाएं।) –

उत्तर

0

पॉज़िक्स गारंटी देता है कि sys/type.h मान कुछ अन्य लोगों के साथ "अंकगणितीय प्रकार की उचित लंबाई" हैं, जिन्हें बिना हस्ताक्षरित या हस्ताक्षरित 'विस्तारित लंबाई' के रूप में निर्दिष्ट किया गया है। उनको आउटपुट करने का एकमात्र मानकों-स्वीकार्य तरीका इसे सबसे बड़े उचित भाषा प्रकार (यू) intmax_t में कास्ट के माध्यम से स्थानांतरित करना होगा और उसके बाद आउटपुट करना होगा।

उन्हें इनपुट करना अधिक खतरनाक होगा (यानी, मानकों-अनुरूप फैशन में संभव नहीं है) क्योंकि बेस प्रकार में आपके रूपांतरण की गारंटी देना मुश्किल होगा, कुछ ओवरफ्लो नहीं हुआ।

1

एसएफआईओ पैकेज (एटी & टी लैब्स 'खुला स्रोत सॉफ्टवेयर एएसटी का हिस्सा) printf और scanf के अनुरूप कार्य करता है जो आपको एक अतिरिक्त पैरामीटर के रूप में (आमतौर पर sizeof() का प्रयोग करके) संख्यात्मक मान के आकार स्पष्ट करने देते है। कुछ उदाहरण:

sfprintf(sfstdout, "%I*d", sizeof(intval), intval); 
sfscanf(sfstdin, "%I*f", sizeof(fltval), &fltval); 

यूएसनिक्स पेपर: Extended Data Formatting Using Sfio

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