2016-02-11 6 views
5

में कॉलम संरेखित करना मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो कुछ वर्ण स्थिरांक के संख्यात्मक मान प्रदर्शित करता है (if कथन में से)। एक समस्या को छोड़कर, कोड काम करता है। आउटपुट को कॉलम में अच्छी तरह से गठबंधन किया जाना चाहिए, लेकिन जैसा कि नीचे दिखाया गया है, यह नहीं है। कॉलम को ठीक से लाइन करने के लिए सबसे अच्छा तरीका क्या है?सी आउटपुट

#include <stdio.h> 
#include <ctype.h> 

int main() { 

    unsigned char c; 

    printf("%3s %9s %12s %12s\n", "Char", "Constant", "Description", "Value"); 

    for(c=0; c<= 127; ++c){ 

     if (c == '\n') { 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\n","newline","0x", c); 

     }else if (c == '\t'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\t","horizontal tab","0x", c); 

     }else if (c == '\v'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\v","vertical tab","0x", c); 

     }else if (c == '\b'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\b","backspace","0x", c); 

     }else if (c == '\r'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\r","carriage return","0x", c); 

     }else if (c == '\f'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\f","form feed","0x", c); 

     }else if (c == '\\'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\","backslash","0x", c); 

     }else if (c == '\''){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\'","single quote","0x", c); 

     }else if (c == '\"'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\"","double quote","0x", c); 

     }else if (c == '\0'){ 
      printf("%3d %7s \t%s \t\t%s%03x\n", c,"\\0","null","0x", c); 
     } 
    } 


    return 0; 
} 

यहाँ उत्पादन है::

यहाँ मेरी कोड है

Output

+5

प्रारूप में स्ट्रिंग औचित्य/लंबाई विकल्प एक अच्छा समाधान है। आप टैब के साथ सही रास्ते पर हैं लेकिन क्योंकि आपके पास वर्णन कॉलम में अलग-अलग लंबाई हैं, यह आपको फेंक रहा है। आप एक प्रारंभिक बिंदु के रूप में 'printf ("% - 30s ", विवरण) को आजमा सकते हैं। –

+0

यदि कोड काम करता है तो यह http://codereview.stackexchange.com/ –

+1

पर अधिक उपयुक्त है, यह काम नहीं करता है क्योंकि कॉलम को रेखांकित किया जाना चाहिए, लेकिन वे –

उत्तर

4

का उपयोग \t अपने आउटपुट डिवाइस की दया पर आप छोड़ देता है। इसके बजाय आप तारों के लिए न्यूनतम फ़ील्ड चौड़ाई का उपयोग कर सकते हैं, उदा। %-20s रिक्त स्थान के साथ कम-से-कम 20 वर्ण, दाएं-पैडिंग प्रिंट करेगा।

%-20.20s यदि यह लंबा था तो स्ट्रिंग को छोटा कर देगा; %-20s सबकुछ दाईं ओर सब कुछ टक्कर देगा। - का मतलब बाएं औचित्य साबित (डिफ़ॉल्ट है सही-सही ठहराने के)


आप एक सहायक समारोह इस्तेमाल कर सकते हैं कोड दोहराव, जैसे बचने के लिए:

void print_item(char code, char const *abbrev, char const *description) 
{ 
    printf("%3d %7s %20.20s %#03x\n", code, abbrev, description, (unsigned char)code); 
} 

// ... in your function 
if (c == '\n') 
    print_item(c, "\\n", "newline"); 

मैं printf प्रारूप स्ट्रिंग संशोधित:

  • के रूप में ऊपर
  • %#03x सुझाव %20.20s का उपयोग करना, # मतलब यह 0x आपके लिए प्रीपेड करेगा
  • (unsigned char)code अंतिम व्यक्ति का मतलब है कि यदि आप किसी भी नकारात्मक वर्ण को पारित करते हैं तो यह अच्छी तरह से व्यवहार करेगा। (आमतौर पर वर्ण -128 से 127 तक मान में वर्णित होते हैं)।
+0

हैं, क्या आप '% # 03x' भाग को समझा सकते हैं अधिक स्पष्ट रूप से, thx। –

+1

@EricWang यह '% 03x' जैसा है लेकिन यह –

+0

की शुरुआत में' 0x' लगाएगा, मुझे बहुत अच्छा जवाब दिखाई देता है। –

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