2009-01-16 9 views
8

फिलहाल मैं रेखा के नीचे का उपयोग कर रहा साथ मुद्रित करने के लिए बाहर डॉट केfprintf/printf का उपयोग करके डैश या डॉट को प्रिंट कैसे करें?

fprintf(stdout, "%-40s[%d]", tag, data); 

मैं उम्मीद कर रहा हूँ उत्पादन निम्नलिखित की तरह कुछ हो सकता है,

 
Number of cards..................................[500] 
Fixed prize amount [in whole dollars]............[10] 
Is this a high winner prize?.....................[yes] 

का उपयोग कर पानी का छींटा या डॉट प्रिंट आउट कैसे fprintf/printf?

उत्तर

10

एक तेजी से दृष्टिकोण:

गद्दी की अधिकतम राशि है कि आप कभी भी हूँ तो आवश्यकता अग्रिम में जानी जाती है (जो आम तौर पर तब होता है जब आप एक निश्चित चौड़ाई वाली तालिका को स्वरूपित कर रहे होते हैं), आप एक स्थिर "पैडर" स्ट्रिंग का उपयोग कर सकते हैं और बस इसके बाहर एक हिस्सा निकाल सकते हैं। यह एक लूप में printf या cout पर कॉल करने से तेज़ होगा।

static const char padder[] = "......................"; // Many chars 

size_t title_len = strlen(title); 
size_t pad_amount = sizeof(padder) - 1 - title_len; 

printf(title); // Output title 

if (pad_amount > 0) { 
    printf(padder + title_len); // Chop! 
} 

printf("[%d]", data); 

तुम भी, एक बयान में यह कर सकता है विश्वास की कुछ छलांग के साथ:

printf("%s%s[%d]", title, padder + strlen(title), data); 
+0

अगर आपका अंतिम सुझाव टूटता है तो 'स्ट्रेल (शीर्षक)> स्ट्रेल (पैडर) ' – Christoph

+0

@ क्रिस्टोफ, इसलिए घोषित" विश्वास की छलांग ":) –

+0

@Ates: दिलचस्प अवधारणा, यह आपके' वफादार प्रोग्रामिंग '; – Christoph

2

आपको स्ट्रिंग को डॉट या डैश पैडिंग के साथ आउटपुट करना होगा।

कुछ की तरह (माफ मेरी सी, यह जंग लगी है):

printAmount(char *txt, int amt) { 
    printf("%s",txt); 
    for(int xa=strlen(txt); xa<40; xa++) { putc('.'); } 
    printf("[%d]",amt); 
    printf("\n"); 
    } 
3

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

int chars_so_far; 
char padder[40+1]= '..........'; //assume this is 40 dots. 
printf("%.40s%n",tag,&chars_so_far); 
printf("%s[%d]",padder+chars_so_far,data); 

संपादित कुछ करना: @Ates 'padder अवधारणा पर आधारित ऊपर मेरी उदाहरण सरलीकृत। टैग स्ट्रिंग बहुत बड़ी या बहुत छोटी है, इस बारे में किसी भी 'विश्वास की छलांग' की आवश्यकता नहीं है - यह हमेशा कॉलम 41 में डेटा शुरू करता है।

+0

मुझे लगता है कि यह एक बयान में किया जा सकता है। –

+0

@Ates: यह कर सकता है, लेकिन अगर आप सीमाओं की उचित जांच करना चाहते हैं तो दो कॉल के बिना आईओओ नहीं कर सकते हैं - इसलिए, आपको इस मान को कैश करने की आवश्यकता है -> दो कथन! – Christoph

1

मैं एक ऐसा फ़ंक्शन लिखने का सुझाव दूंगा जो एक स्ट्रिंग को पैड करेगा एक्स वर्ण और अपने printf स्ट्रिंग पर पहला तर्क उत्पन्न करने के लिए इसका उपयोग करें। कुछ की तरह:

char s[40]; 
pad_str(tag, s, 40, '.'); 
fprintf(stdout, "%-40s[%d]", s, data); 

ध्यान रखें कि आपके नमूना डेटा की तीसरी पंक्ति इस प्रारूप की आवश्यकता होगी:

"%-40s[%s]" 
2

एक अन्य समाधान

static inline size_t min(size_t a, size_t b) 
{ 
    return a < b ? a : b; 
} 

फिर एक छोटे से सहायक समारोह का उपयोग कर, आप निम्न कर सकते :

char padder[] = "........................................"; 
int len = min(strlen(tag), sizeof(padder) - 1); 
printf("%.*s%s[%d]", len, tag, padder + len, data); 

यह अनिवार्य रूप से क्या आटेस तैनात है, लेकिन मैं वास्तव में अपने दम पर इस पता लगा है;)

+0

आकार_टी को int में बदलें; आपको printf() परिवार के कार्यों में '*' को एक int पास करना होगा। –

+0

या सहायक को अधिक उपयोगी बनाएं: printf ("% s% s [% d]", शीर्षक, getPadding (शीर्षक), डेटा); –

+0

@ जोनाथन: धन्यवाद, इसे सही किया गया ... – Christoph

9

आप आसानी से printf

cout << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl; 

के बजाय iostreams साथ ऐसा कर सकते या फिर आप वास्तव में fprintf उपयोग करने के लिए (जैसे कि जरूरत है, आपको लिखने के लिए एक फ़ाइल * पास कर दी गई है)

strstream str; 
str << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl; 
printf(%s", str.str()); 
+0

+1 पढ़ने और समझने और कुछ के तहत तोड़ने में आसान होने के लिए +1 (कुछ हद तक असामान्य स्थितियों के बावजूद)। –

0

मुझे लगता है कि एक बेहतर तरीका है।

#include <string.h> 
#include <stdio.h> 

#define MIN(A,B) ((A)<(B)?(A):(B)) 
char *dashpad(char *buf, int len, const char *instr) { 
    memset(buf, '-', len); 
    buf[len] = 0; 
    int inlen = strlen(instr); 
    memcpy(buf, instr, MIN(len, inlen)); 
    return buf; 
} 
main() { 
    char buf[40]; 
    printf("%s\n", dashpad(buf, 40, "Hello world, dash padded ")); 
} 
+0

सबसे पहले पैड चरित्र के साथ पूरे बफर को भरना, और फिर उन्हें ओवरराइट करना थोड़ा कचरा लगता है ... –

+0

इसके अलावा, आपके पास एक बफर ओवररन है (आपको सी पसंद नहीं है) - एस/बी: buf [len-1 ] = 0; –

+0

और आपके पास शून्य() में एक शून्य-मिटा बग है, जो लेन-1 भी होना चाहिए। –