2010-03-17 3 views
15

डिफ़ॉल्ट रूप से, printf() दाईं ओर स्ट्रिंग को संरेखित करना प्रतीत होता है।printf के साथ तारों को केंद्रित करना()

printf("%10s %20s %20s\n", "col1", "col2", "col3"); 
/*  col1     col2     col3 */ 

मैं भी करने के लिए पाठ संरेखित कर सकते हैं इस तरह छोड़ दिया:

printf("%-10s %-20s %-20s", "col1", "col2", "col3"); 

वहाँ एक त्वरित तरीका पाठ केंद्रित करने के लिए है? या क्या मुझे एक ऐसा फ़ंक्शन लिखना है जो test जैसे (space)(space)test(space)(space) में स्ट्रिंग को बदलता है यदि उस कॉलम के लिए टेक्स्ट चौड़ाई 8 है?

उत्तर

22

printf से ही चाल नहीं कर सकते, लेकिन आप "अप्रत्यक्ष" चौड़ाई है, जो निर्दिष्ट करता है के साथ खेल सकते एक तर्क से इसे पढ़कर चौड़ाई। 'इस (ठीक है, नहीं सही) की कोशिश की सुविधा देता है

void f(char *s) 
{ 
     printf("---%*s%*s---\n",10+strlen(s)/2,s,10-strlen(s)/2,""); 
} 
int main(int argc, char **argv) 
{ 
     f("uno"); 
     f("quattro"); 
     return 0; 
} 
2

कोई टेक्स्ट नहीं है printf() केंद्र पाठ के लिए प्रारूप निर्दिष्ट।

आपको अपना स्वयं का फ़ंक्शन लिखने या लाइब्रेरी का पता लगाने की आवश्यकता होगी जो आप जिस कार्यक्षमता को ढूंढ रहे हैं उसे प्रदान करता है।

0

हां, आपको या तो अपना खुद का फ़ंक्शन लिखना होगा जो "परीक्षण" आदि देता है, उदा।

printf("%s %s %s", center("col1", 10), center("col2", 20), center("col3", 20)); 

या आप एक center_print समारोह, निम्नलिखित की तरह कुछ है:

void center_print(const char *s, int width) 
{ 
     int length = strlen(s); 
     int i; 
     for (i=0; i<=(width-length)/2; i++) { 
       fputs(" ", stdout); 
     } 
     fputs(s, stdout); 
     i += length; 
     for (; i<=width; i++) { 
       fputs(" ", stdout); 
     } 
} 
+0

पहला सुझाव: कैसे इस स्मृति लीक बिना impl'd जा सकता है? – kevinarpe

+0

यदि आप कुछ मानदंडों के आधार पर कुछ बफर को आवंटित करते हैं जो अनुचित नहीं लगते हैं (उदाहरण के लिए, 20 से अधिक तर्क एक प्रिंटफ के लिए केंद्रित नहीं होंगे, और केंद्रित परिणामों में से कोई भी 200 बाइट से अधिक नहीं होगा), आप केंद्र को दे सकते हैं फ़ंक्शन बस प्रत्येक आमंत्रण पर बफर घुमाएं। – hlovdal

0

आप नीचे दिए गए दो विकल्पों में से किसी का भी उपयोग कर सकते हैं: (

NAME1 केंद्र:

char name[] = "Name1"; 

//Option One 
printf("%*s", 40+strlen(name)/2, name, 40-strlen(name)/2, ""); 
puts("");//skip one line 
//Option two 
printf("%*s", 40+strlen("Name2")/2, "Name2", 40-strlen("Name2")/2, ""); 

उत्पादन होता है)
नाम 2 (केंद्र)

0

आप इस समस्या के लिए अपना कार्य लिखने का प्रयास कर सकते हैं।

/** 
* Returns a sting "str" centered in string of a length width "new_length". 
* Padding is done using the specified fill character "placeholder". 
*/ 
char * 
str_center(char str[], unsigned int new_length, char placeholder) 
{ 
    size_t str_length = strlen(str); 

    // if a new length is less or equal length of the original string, returns the original string 
    if (new_length <= str_length) 
     return str; 

    char *buffer; 
    unsigned int i, total_rest_length; 

    buffer = malloc(sizeof(char) * new_length); 

    // length of a wrapper of the original string 
    total_rest_length = new_length - str_length; 

    // write a prefix to buffer 
    i = 0; 
    while (i < (total_rest_length/2)) { 
     buffer[i] = placeholder; 
     ++i; 
    } 
    buffer[i + 1] = '\0'; 

    // write the original string 
    strcat(buffer, str); 

    // write a postfix to the buffer 
    i += str_length; 
    while (i < new_length) { 
     buffer[i] = placeholder; 
     ++i; 
    } 
    buffer[i + 1] = '\0'; 

    return buffer; 
} 

परिणाम:

puts(str_center("A", 0, '-')); // A 
puts(str_center("A", 1, '-')); // A 
puts(str_center("A", 10, '-')); // ----A----- 
puts(str_center("text", 10, '*')); // ***text*** 
puts(str_center("The C programming language", 26, '!')); // The C programming language 
puts(str_center("The C programming language", 27, '!')); // The C programming language! 
puts(str_center("The C programming language", 28, '!')); // !The C programming language! 
puts(str_center("The C programming language", 29, '!')); // !The C programming language!! 
puts(str_center("The C programming language", 30, '!')); // !!The C programming language!! 
puts(str_center("The C programming language", 31, '!')); // !!The C programming language!!!