2011-12-14 11 views
27

पृष्ठभूमि: मेरे पास कई स्क्रिप्ट हैं जो प्रमुख "0x" ढूंढकर हेक्स संख्याओं की तलाश में लॉग फ़ाइलों को पार्स करती हैं। हमारी एम्बेडेड सी लाइब्रेरी एक नए printf में बदल गई। नया प्रिंटफ हमारे पिछले की तुलना में अधिक मानकों का अनुपालन करता है और मेरी स्क्रिप्ट टूट जाती है।सी प्रिंटफ प्रारूप "% # x" के साथ "0x" के बिना 0 (शून्य) मुद्रित क्यों किया जाता है?

एक लिनक्स बॉक्स पर:

#include <stdio.h> 
int main(void) 
{ 
    printf("%#010x\n", 0); 
    printf("%#010x\n", 1); 
    return 0; 
} 

आउटपुट (glibc का उपयोग) है: हमारे firmwware पर

0000000000 
0x00000001 

आउटपुट था:

0x00000000 
0x00000001 

printf (3), से '#' ध्वज चरित्र: "एक्स और एक्स रूपांतरणों के लिए, एक nonzero परिणाम स्ट्रिंग" 0x "(या एक्स बातचीत के लिए" 0 एक्स "है आयनों) इसे प्रस्तुत किया। "

मैं उत्सुक हूँ क्यों। सी मानकों के दस्तावेजों के माध्यम से खोदने या मानक समिति के सदस्यों के लिए दोपहर का भोजन खरीदने के बिना, एक शून्य मूल्यवान तर्क पर एक अग्रणी 0x क्यों नहीं?

+1

जंगली अनुमान: आधार पर ध्यान दिए बिना 0 0 है, इसलिए इसे निर्दिष्ट करने की कोई आवश्यकता नहीं है। –

+9

यह ध्यान देने योग्य है कि आप '0x% 08x" लिखकर एक अग्रणी '0x' सहित * हमेशा * का व्यवहार प्राप्त कर सकते हैं, जबकि मानक वर्णित व्यवहार लाइब्रेरी से प्राप्त करने के लिए कठिन होगा * हमेशा * शामिल अग्रणी '0x'। हो सकता है कि मानदंड समिति पूरी तरह से सबसे आम मामले की बजाय, कठिन-से-प्राप्त-अन्यथा मामले के लिए अनुकूलन कर रही थी? (बेशक, आप '"% # 10x "' से '0x% 8x" ''' नहीं बदल सकते हैं, लेकिन फिर, किसी को शून्य-पैडिंग के बिना '0x0' देखना चाहते हैं।) – ruakh

+2

कोई उल्लेख नहीं है इनमें से [सी 8 9 तर्क] (http://www.lysator.liu.se/c/rat/title.html) (एचटीएमएल) या [सी 99 तर्क] में (http: //www.open-std। संगठन/जेटीसी 1/एससी 22/wg14/www/C99RationaleV5.10.pdf) (पीडीएफ)। –

उत्तर

21

मानक इस तरह से लिखा जा रहा है:

  • %#x और %#o गारंटी नहीं है कि उत्पादन सही ढंग से base = 0 साथ strtol का उपयोग कर पार्स किया जा सकता प्रयास करें।

  • इन मामलों में, # ध्वज के रूप में कुछ अतिरिक्त वर्णों को जोड़ता है। उदाहरण के लिए, 0 को 0 के रूप में मुद्रित किया गया है क्योंकि अतिरिक्त 0x जोड़ने की आवश्यकता नहीं है। यदि आप न्यूनतम फ़ील्ड चौड़ाई और 0-पैडिंग निर्दिष्ट करते हैं तो यह बहुत समझ में आता है।

  • यदि आप हमेशा 0x जोड़ना चाहते हैं, तो आप अक्सर 0x%x जैसे कुछ लिख सकते हैं। इसलिए %#x उपयोगी होने के लिए प्रतीत होता है केवल उन विशेष मामलों जिसमें आप वास्तव में चाहते हैं 0. की विशेष हैंडलिंग लेकिन पूर्व लंबित 0x के डिफ़ॉल्ट क्षेत्र चौड़ाई विनिर्देशक जैसे) के साथ अच्छी तरह से काम नहीं करता है में0x%12x सही उचित है 0x और हेक्स अंकों के बीच रिक्त स्थान से, जो कि उस मामले में क्या चाहता है होने की संभावना नहीं है। इस मामले के लिए स्प्रिंटफ के साथ एक अतिरिक्त प्रारंभिक पास की आवश्यकता होगी, इसलिए "0x2ac2" जैसी हेक्स स्ट्रिंग printf("%12s", hexstr); जैसे कुछ हद तक उचित जगह हो सकती है, printf("0x%012x", hexstr); जैसे कुछ स्थानों का उपयोग करके रिक्त स्थान पर 0 के साथ औपचारिक रूप से उचित होकर एक पार्सर के लिए वैध हेक्स अंकों का उत्पादन करने की उम्मीद है ।

अब %#x काम के लिए निर्दिष्ट है अलगाव में बहुत अधिक समझ में आता है। और %010x जैसे कुछ काम काम के लिए निर्दिष्ट है अलगाव में बहुत समझ में आता है। आप इन दो संशोधकों को जोड़ रहे हैं, और अंत परिणाम, तर्कसंगत, अजीब है। अन्य अनुप्रयोगों के लिए, जैसे कि 0x0 के बजाय 0, रखने के लिए स्वचालित तालिकाओं को स्वत: उत्पन्न करने के लिए ऑटो सी कोडिंग करना, कोई मुद्दा नहीं है।

लेकिन %#x और %010x को गठबंधन करने की कोई आवश्यकता नहीं है।आप जो चाहते हैं उसे करने के लिए आप बस 0x%08x लिख सकते हैं।

+1

और उत्तर पोस्ट करने के बाद, मैंने देखा कि @ruakh पहले से ही एक ही टिप्पणी में एक ही जानकारी दे चुका था। क्षमा याचना। –

+6

+1। माफ़ी मांगने की कोई ज़रूरत नहीं है। उत्तर टिप्पणियों से बेहतर हैं। मैंने अपने विचारों को एक उत्तर के बजाय टिप्पणी के रूप में पोस्ट किया, क्योंकि मुझे पता था कि वे पूर्ण नहीं हो पाएंगे; लेकिन आपका जवाब बहुत अधिक गहन है, और बहुत समझ में आता है। – ruakh

+0

दोनों उत्तर और टिप्पणियों की सराहना की जाती है! स्ट्रेटोल के साथ संगत होने का विचार समझ में आता है। अब मेरे लिए समय 0x% 08x पर बहुत सारे कोड को बदलने के लिए समय है। –

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