2010-10-20 23 views
6

printf रूपांतरण विनिर्देश % हैं, इसके बाद झंडे, चौड़ाई, परिशुद्धता, लंबाई संशोधक और रूपांतरण विनिर्देशक हैं। क्या रूपांतरण विनिर्देश के आकार के लिए व्यावहारिक सीमा है?printf रूपांतरण विनिर्देश की आकार सीमा

आईई। %s 2 वर्ण लंबा है, जबकि %08.2f 6 वर्ण लंबा है। मेरा सवाल यह है कि सी 99 मानक के अनुसार प्रारूप प्रारूप में अधिकतम एकल विनिर्देश की लंबाई क्या हो सकती है?

+0

आह मैं देखता हूं, आप प्रारूप स्ट्रिंग के एक प्रारूप प्रारूप विनिर्देश पर व्यावहारिक सीमाओं में रुचि रखते हैं। मैं तब अपना जवाब हटा देता हूं। –

+0

मैं उत्सुक हूं - क्या जिज्ञासा के अलावा आप जानना चाहते हैं? – nategoose

+0

@nategoose: मैं 'snprintf' के आस-पास एक बहुत ही विशेष रैपर पर विचार कर रहा हूं और यह समझना चाहता हूं कि क्या मैं कुछ अस्थायी बफर आवंटित कर सकता हूं – zaharpopov

उत्तर

2

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

उदाहरण के लिए, फील्ड चौड़ाई और परिशुद्धता पर विचार करें। मानक कहता है कि वे दशमलव पूर्णांक हैं लेकिन उनकी सीमा निर्दिष्ट नहीं करते हैं। इसलिए आप क्षेत्र चौड़ाई या परिशुद्धता के रूप में मनमाने ढंग से बड़े पूर्णांक के साथ रूपांतरण विनिर्देश लिख सकते हैं।

+0

था इसलिए सवाल में "व्यावहारिक" पूछा गया था, इस चौड़ाई सीमित होने के बाद और बड़े मान मान्य नहीं हैं। भले ही 64-बिट, यह व्यावहारिक रूप से – zaharpopov

+1

सीमित है, जबकि 'printf' संभवतः किसी भी सीमा को लागू नहीं करता है (और इसकी आवश्यकता नहीं है), तथ्य यह है कि' printf' मुद्रित वर्णों की संख्या देता है, इसका मतलब है कि आपको अनिर्दिष्ट/अपरिभाषित नहीं होगा (नहीं स्पष्ट करें) व्यवहार यदि आप अत्यधिक बड़े क्षेत्र चौड़ाई/परिशुद्धता का उपयोग करते हैं। एक और यथार्थवादी कारण प्रारूप विनिर्देश असीमित लंबाई हो सकता है अनावश्यक झंडे, उदा। '% +++++++++++++++++++++++ d'। –

+0

@zaharpopov: ठीक है, प्रश्न में दो दृष्टिकोण हैं 1) व्यावहारिक 2) मानक के अनुसार। मैंने बाद का दृष्टिकोण लिया। पूर्व संकलक और पुस्तकालय कार्यान्वयन पर निर्भर करता है। – laalto

1

आप एक शाब्दिक स्ट्रिंग मतलब है, यह 4095 वर्ण

5.2.4.1 अनुवाद सीमा
...
है - एक चरित्र स्ट्रिंग में 4095 वर्ण शाब्दिक या विस्तृत स्ट्रिंग शाब्दिक (संयोजन के बाद)
...

मैं 509 अक्षरों (printf/scanf प्रारूप स्ट्रिंग्स के लिए नहीं) के C89 सीमा ने काट लिया गया है, तो यह लाया अच्छा परिवर्तन में से एक है पर C99 :-) द्वारा


संपादित करें: glibc कार्यान्वयन (नहीं स्टैंडर्ड परिभाषा)

glibc कार्यान्वयन एक read_int समारोह से चौड़ाई हो जाता है।
तो, इस लागू करने के लिए, जाहिरा तौर पर, हो सकता है, सीमा INT_MAX (मैं read_int समारोह के लिए खोज नहीं किया है) है।

+1

हां, लेकिन यह मेरा सवाल नहीं है। प्रारूप एक शाब्दिक नहीं हो सकता है - मेरा प्रश्न '%' के बाद अधिकतम विनिर्देशक की लंबाई के बारे में है – zaharpopov

1

printf रूपांतरण विनिर्देश% झंडे, चौड़ाई, परिशुद्धता, लंबाई संशोधक और रूपांतरण विनिर्देशक के बाद% हैं। क्या रूपांतरण विनिर्देश के आकार के लिए व्यावहारिक सीमा है?

मुझे कई मानक printf कार्यान्वयन और मेरे सामान्य प्रभाव के साथ अतीत में सौदा करना पड़ा कि कोई विशेष सीमा लागू नहीं है।

स्वरूप स्ट्रिंग आमतौर पर चरित्र द्वारा वर्णित चरित्र है। (सरल FSM सोचें।) अधिकांश printf कार्यान्वयन आंतरिक रूप से कुछ भी बफर करने से बचते हैं और यहां तक ​​कि संख्याओं के लिए चार रूपांतरणों को चार रूपांतरणों से दशमलव तक उपयोग करते हैं (यहां तक ​​कि atoi भी नहीं)।

उदाहरण के लिए आप printf को FreeBSD kernel (जहां कई अन्य कार्यान्वयनों से अक्सर कोड उठाते हैं) के अंदर लागू किया जा सकता है। यह निश्चित रूप से सरलीकृत कार्यान्वयन (जोड़े कर्नेल-विशिष्ट tweaks के साथ) है, फिर भी यह दर्शाता है कि स्वरूप स्ट्रिंग अक्सर कैसे संभाला जाता है।

एनबी।बस glibc के vfprintf() कार्यान्वयन की जांच की गई है और वे malloc() के साथ आंतरिक रूप से एक बफर (यदि आवश्यक हो) आवंटित करते हैं। तो न तो विशेष सीमा।

मेरा प्रश्न है, सी 99 मानक के अनुसार, प्रारूप स्ट्रिंग में अधिकतम एकल विनिर्देश की लंबाई क्या है?

स्वरूप विनिर्देशक मेरे ज्ञान के लिए एक स्ट्रिंग और स्ट्रिंग लंबाई का एक हिस्सा मानक द्वारा सीमित नहीं है। और जैसा कि मैंने ऊपर उल्लेख किया है, न ही मैंने कभी ऐसी किसी सीमा के साथ कार्यान्वयन देखा है।

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