आउटपुट में समान लंबाई प्राप्त करने के लिए प्रिंटफ () का उपयोग करके तारों को प्रारूपित कैसे करें?


92

मेरे पास दो फ़ंक्शन हैं, एक जो संदेशों को उत्पन्न करता है Starting initialization...और दूसरा जो रिटर्न कोड और आउटपुट चेक करता है "Ok", "Warning"या "Error"। हालांकि, जो उत्पादन होता है वह अलग लंबाई का होता है:

Starting initialization...Ok.
Checking init scripts...Ok.

मैं इस तरह से कुछ कैसे प्राप्त कर सकता हूं:

Starting initialization...       Ok.
Checking init scripts...         Ok.

जवाबों:


159

आप स्ट्रिंग फ़ील्ड पर चौड़ाई निर्दिष्ट कर सकते हैं, जैसे

printf("%-20s", "initialization...");

और फिर उस फ़ील्ड के साथ जो भी मुद्रित किया जाता है वह आपके द्वारा इंगित की गई चौड़ाई के लिए खाली-पेड होगा।

-उस क्षेत्र में अपने पाठ बाएँ सही ठहराते हैं।


130
काश, मैं उस उच्च को गिनने के लिए पर्याप्त चतुर नहीं हूं। हालाँकि, मुझे भरोसा है कि मेरे उदाहरण से एक्सट्रपलेट करने के लिए पर्याप्त बुद्धिमान होना चाहिए :)
कार्ल स्मोत्रिकज़

3
सही के बारे में क्या उचित है? K & R
Ungeheuer

9
राइट जस्टिफाइड डिफॉल्ट है। ए के बिना -, आपका डेटा सही उस क्षेत्र में उचित होगा जिसकी चौड़ाई आपने निर्दिष्ट की है।
कार्ल स्मोत्रिकज़

24

printfचौड़ाई विनिर्देशकों के साथ स्वरूपण की अनुमति देता है। जैसे


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

आप बाएं-औचित्य को इंगित करने के लिए एक नकारात्मक चौड़ाई निर्दिष्ट का उपयोग करेंगे क्योंकि डिफ़ॉल्ट सही-औचित्य का उपयोग करना है।


18

इसके अतिरिक्त, यदि आप चुनने का लचीलापन चाहते हैं, तो आप widthनिम्नलिखित दो प्रारूपों में से एक (ट्रंकेशन के साथ या बिना) चुन सकते हैं:

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."

13

वहाँ भी %nसंशोधक है जो कुछ परिस्थितियों में मदद कर सकता है। यह उस स्तंभ को लौटाता है जिस पर स्ट्रिंग अब तक था। उदाहरण: आप कई पंक्तियों को लिखना चाहते हैं जो तालिका की तरह पहली पंक्ति की चौड़ाई के भीतर हैं।

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

जो कुछ भी दो तार header1और header2हो सकता है की एक ही चौड़ाई के 2 कॉलम मुद्रित करेगा । मुझे नहीं पता कि सभी कार्यान्वयन में %nसोलारिस और लिनक्स हैं या नहीं।


यह समाधान काम करता है, लेकिन जो कोई भी इसे लेता है और इसे अपने कोड में रखता है उसे स्मृति कमजोरियों को पेश करने के जोखिम के बारे में पता होना चाहिए ।
मैथ्यू कोल

0

आपके संदेश लाइन अप करने के लिए हाथ से रिक्त स्थान जोड़ने की गिनती के बजाय कम-तकनीकी समाधान भी है। कुछ भी आपके संदेश स्ट्रिंग्स में कुछ अनुगामी रिक्त स्थान शामिल करने से रोकता है।


-2

टैब के उपयोग के साथ प्रारंभ करें, \ t वर्ण संशोधक। यह एक निश्चित स्थान (कॉलम, टर्मिनल लिंगो) पर आगे बढ़ेगा। हालाँकि, यह मदद नहीं करता है अगर कॉलम की चौड़ाई से अधिक अंतर हो (4 वर्ण, यदि मुझे सही ढंग से याद है)।

इसे ठीक करने के लिए, निर्धारित संख्या में टैब्स (5? 6 ;, इसे आज़माएं) का उपयोग करके अपना "ओके / NOK" सामान लिखें, फिर नए-अस्तर के बिना ( \ r ) वापस लौटें और अपना संदेश लिखें।


5
हमेशा एक खतरा होता है कि एक स्ट्रिंग एक टैब स्टॉप से ​​अधिक लंबी होती है जिसके परिणामस्वरूप परिणामी टैब और पाठ को गलत तरीके से संरेखित किया जाता है।
पीपी।

वास्तव में नहीं ... पहले tabbed OK / NOK लिखें, फिर / आर, अब वाक्यांश लिखें, अब / n। वाक्यांश OK / NOK को अधिलेखित कर सकता है। लेकिन आपका रास्ता बेहतर है, मुझे नकारात्मक औचित्य के बारे में पता नहीं था।
jpinto3912
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.