2013-07-19 8 views
11

का उपयोग कर मैं सी में printf का उपयोग कर स्तंभों प्रिंट करना चाहते हैं मैं इस कोड लिखा है:प्रिंट बराबर-चौड़ाई सी में कॉलम printf स्वरूपण

#include <stdio.h> 

void printme(char *txt1, char *txt2, char *txt3) 
{ 
    printf("TXT1: %9s TXT2 %9s TXT3 %9s\n", txt1, txt2, txt3); 
} 


int main() 
{ 
    printme("a","bbbbbbbeeeeebbbbb","e"); 
    printme("aaaaaaaa","bbbbbbbbbbbb","abcde"); 
    return 0; 
} 

यह काम करता है, लेकिन मैं इस तरह के उत्पादन:

TXT1:   a TXT2 bbbbbbbeeeeebbbbb TXT3   e 
TXT1: aaaaaaaa TXT2 bbbbbbbbbbbb TXT3  abcde 

तो कॉलम बराबर चौड़ाई नहीं हैं। मूल रूप से, मैं इसे इस तरह बनाना चाहता हूं, इससे कोई फर्क नहीं पड़ता कि मेरे तर्क में पाठ कितना समय है, मेरा फ़ंक्शन हमेशा एक अच्छा प्रारूपित कॉलम प्रिंट करेगा। सवाल यह है कि मैं यह कैसे कर सकता हूं?

अच्छा saing से मेरा मतलब है कि कोई फर्क नहीं पड़ता कि कितनी देर तक पाठ मैं अपने मुद्रण कार्य करने के लिए पारित, यह हमेशा बाहर बराबर-चौड़ाई कॉलम प्रिंट होगा उदाहरण के लिए,:

मैं इस उत्पादन है कि इस तरह दिखता है:

a   cd`   fg   ij 
a   cd    fg   ij 
a   cd    fg   ij 
ab   cd    fg   ij 
ab   cd    fg   i j 
ab   cd    fg   ij 
ab   cd    fg   ij 
ab   cde    fgh   ij 
ab   cde    fgh   ij 

मैं इसे इस तरह दिखना चाहते हैं (कोई बात नहीं कितनी देर तक अपने पाठ तर्क हो जाएगा):

a   cd`   fg   ij 
a   cd   fg   ij 
a   cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cde   fgh   ij 
ab  cde   fgh   ij  
+2

* अच्छे प्रारूपित कॉलम * में * अच्छा * परिभाषित करें। – ouah

+2

इसलिए अपने टेक्स्ट को पहले से स्कैन करें, पता लगाएं कि सबसे लंबी स्ट्रिंग क्या है, और उस कॉलम पैडिंग मानों के लिए उस लंबाई का उपयोग करें। –

+0

संभवतः http://stackoverflow.com/questions/2956296/printing-values-in-special-format-using-printf –

उत्तर

4

आप txt1, txt2, और txt3 के लिए अधिकतम लंबाई पा सकते हैं, और फिर इसे स्वरूपित:

// compute the max string length of txt1 inputs in advance 
int s1 = strlen(firstTxt1); 
if (s1 < strlen(secondTxt1) 
    s1 = strlen(secondTxt1); 
... 

printf("%.*s %.*s %.*s\n", s1, txt1, s2, txt2, s3, txt3); 
+0

यदि आपके पास लगातार आउटपुट होता है तो क्या होता है (उदाहरण के लिएएक टेबल जैसी संरचना में निरंतर प्रिंटिंग जानकारी) और अचानक एक कॉलम के लिए डेटा अपने सभी पूर्ववर्तियों से अधिक लंबा है (कॉलम को व्यापक बनाने की आवश्यकता है)? मैं '\ b' और' \ r' के बारे में जानता हूं लेकिन वे वास्तव में इस समस्या को हल नहीं करते हैं। – Arc676

+0

शायद यह मेरा कंपाइलर है, लेकिन यह विधि मेरे लिए क्यों काम नहीं करती है? 'printf ("%। * s ", 5," hi "); 'सिर्फ प्रिंट" हाय "जैसे कि लंबाई निर्दिष्ट नहीं थी लेकिन'% 5s' ठीक काम करता है। क्या आपके पास कोई लिंक है जो विशेष रूप से विस्तार से समझाता है? मुझे लगता है कि Google खोज शब्द "printf में स्वरूपण" होगा? – Arc676

3

दुर्भाग्य से, वहाँ ऐसा करने के लिए कोई छोटी सी विधि है।

आप एक दो-पास विधि कर सकता है - मुख्य() में:

char **data[] = { { "a","bbbbbbbeeeeebbbbb","e" }, 
        {"aaaaaaaa","bbbbbbbbbbbb","abcde" } }; 


get_columwidths(data[0][0], data[0][1], data[0][2]); 
get_columwidths(data[1][0], data[1][1], data[1][2]); 

printme(data[0][0], data[0][1], data[0][2]); 
printme(data[1][0], data[1][1], data[1][2]); 

और फिर इस:

int columnwidths[3]; 

void get_columwidths(const char *s1, const char *s2, const char *s3) 
{ 
    int len1 = strlen(s1); 
    int len2 = strlen(s2); 
    int len3 = strlen(s3); 

    if (columnwidths[0] < len1) columnwidths[0] = len1; 
    if (columnwidths[1] < len2) columnwidths[1] = len2; 
    if (columnwidths[2] < len3) columnwidths[2] = len3; 
} 

void printme(char *txt1, char *txt2, char *txt3) 
{ 
    printf("TXT1: %*s TXT2 %*s TXT3 %*s\n", 
      columnwidths[0], txt1, columnwidths[1], txt2, columnwidths[2], txt3); 
} 
+0

+1 क्योंकि '% * s' के बजाय'% * s' का उपयोग करके * एस' (अवधि को नोट करें) स्वीकार्य उत्तर में इस विधि को पूर्णांक प्रिंट करने पर _not_ प्रिंटिंग शून्य नहीं होता है ('% * d')। – Arc676

8

आप तार छोटा किया जा करना चाहते हैं अगर वे से भी बड़ा कर रहे हैं किके साथ

printf("TXT1: %9.9s TXT2 %9.9s TXT3 %9.9s\n", txt1, txt2, txt3); 

: स्तंभ चौड़ाई है, तो आप सिर्फ एक सटीक स्ट्रिंग प्रारूप विनिर्देश के लिए जोड़ सकते हैं ,

TXT1:   a TXT2 bbbbbbbee TXT3   e 
TXT1: aaaaaaaa TXT2 bbbbbbbbb TXT3  abcde 
2

मेरी सरल पुस्तकालय पर एक नजर डालें libtprint:, अपने उदाहरण कार्यक्रम के उत्पादन में लगता है कि https://github.com/wizzard/libtprint कोड बहुत आसान है, आप को समझने के लिए यह कैसे काम करता सक्षम होना चाहिए।

मूल रूप से आपको जो भी चाहिए वह प्रत्येक कॉलम के लिए फ़ील्ड चौड़ाई के साथ खेलना और संरेखण ऑफ़सेट की गणना करना है।

उम्मीद है कि यह मदद करता है!

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