2011-05-09 14 views
32
#define SIZE 9 
int number=5; 
char letters[SIZE]; /* this wont be null-terminated */ 
... 

char fmt_string[20]; 
sprintf(fmt_string, "%%d %%%ds", SIZE); 
/* fmt_string = "%d %9d"... or it should be */ 

printf(fmt_string, number, letters); 

क्या ऐसा करने का कोई बेहतर तरीका है?printf स्ट्रिंग, चर लंबाई लंबाई

+0

आप एक प्रारूप स्ट्रिंग का निर्माण कर रहे हैं। लेकिन आपको 'sprintf' द्वारा' fmt_string' पर लौटाई गई स्ट्रिंग असाइन करनी चाहिए और 'fmt_string' पैरामीटर सूची में नहीं होना चाहिए। – pavium

+0

क्या कोई विशेष कारण है कि आप कहते हैं कि 'अक्षरों' को निरस्त नहीं किया जाएगा? –

+1

@AndrewKeeton यह एक बड़े डेटासेट के साथ एक खोज समस्या के लिए था जहां मैं शून्य पात्रों को रखने के लिए जगह बर्दाश्त नहीं कर सका। –

उत्तर

94

एक विशेष प्रारूप स्ट्रिंग बनाने की कोई आवश्यकता नहीं है। printf आपको प्रारूप पैरामीटर में सटीकता के रूप में .* का उपयोग करते हुए पैरामीटर (जो मान से पहले) का उपयोग करके सटीक निर्दिष्ट करने की अनुमति देता है।

उदाहरण के लिए:

printf ("%d %.*s", number, SIZE, letters); 

नोट: वहाँ चौड़ाई के बीच एक अंतर (जो कम से कम क्षेत्र चौड़ाई है) और सटीक (जो वर्णों की अधिकतम संख्या देता है मुद्रित करने के लिए) है। %*s चौड़ाई निर्दिष्ट करता है, %.s परिशुद्धता निर्दिष्ट करता है। (और आप भी %*.* उपयोग कर सकते हैं, लेकिन फिर आप दो पैरामीटर, परिशुद्धता के लिए चौड़ाई एक के लिए एक की जरूरत है) (लिनक्स के तहत man 3 printf)

भी देखें printf आदमी पेज और विशेष रूप से वर्गों क्षेत्र चौड़ाई और परिशुद्धता पर:

एक दशमलव अंकों स्ट्रिंग एक लिख सकते हैं के बजाय

"*" या "* मी $" (कुछ दशमलव पूर्णांक मीटर के लिए) निर्दिष्ट करने के लिए कि परिशुद्धता अगले तर्क में दी गई है, या एम-वें बहस में , क्रमशः, जो प्रकार int होना चाहिए।

+0

उन्हें मिश्रित किया गया था ... स्कैनफ वह है जिसके पास वह विकल्प नहीं है। –

+5

यह 2 लंबाई के साथ भी काम करता है जैसे '"% *। * एस ", लघु तरंग, अधिकतम लम्बाई, अक्षरों। –

+0

नोट: '" * एम $ "' मानक सी नहीं है – chux

3

कुछ हद तक अज्ञात फ़ंक्शन asprintf है। पहला पैरामीटर **char है। स्ट्रिंग के लिए यह फ़ंक्शन malloc स्थान होगा ताकि आपको बहीखाता नहीं करनी पड़े। किए जाने पर स्ट्रिंग free को याद रखें।

char *fmt_string; 

asprintf(&fmt_string, "%%d %%%ds", SIZE); 
printf(fmt_string, number, letters); 
free(fmt_string); 

उपयोग का एक उदाहरण है।

+3

हालांकि एस्पप्रिंट वास्तव में एक दिलचस्प कार्य है, यह ध्यान रखना महत्वपूर्ण है कि यह एक gnu विस्तार है। साथ ही, मुझे यकीन नहीं है कि यह सवाल कैसे संबोधित करता है। – Trent

+1

@ ट्रेंट, यह सच है कि यह एक जीएनयू एक्सटेंशन के रूप में शुरू हुआ, लेकिन औसत समय में [ओपनबीएसडी] (http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man3/asprintf.3), [फ्रीबीएसडी] (http://www.freebsd.org/cgi/man.cgi?query=asprintf) और [नेटबीएसडी] (http://netbsd.gw.com/cgi-bin/man-cgi?asprintf) इसे लागू किया है। यहां तक ​​कि [मैक ओएस एक्स] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/asprintf.3.html) अब यह है। –

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