2009-01-16 51 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

更快的方法:

如果填充的最大數量,你會永遠需要事先知道(當你格式化一個固定寬度的表格時,通常情況下是這樣的),你可以使用一個靜態的「padder」字符串,並從中取出一個塊。這將比在循環中呼叫printfcout更快。

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

如果`strlen(title)> strlen(padder)` – Christoph 2009-01-16 19:28:44

+0

@Christoph,因此被宣佈爲「信仰的飛躍」:)你的最後一個建議會破壞: – 2009-01-16 19:48:33

+0

@Ates:有趣的概念,這是你的忠實編程;) – Christoph 2009-01-16 20:07:06

2

你將不得不輸出帶點或短劃線填充的字符串。

喜歡的東西(原諒我的C,這是生鏽):

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'軋車概念 簡化我的例子。這種方式不需要任何'信念',關於標籤字符串是否太大或太小 - 它始終啓動列41中的數據。

+0

我認爲這可以在一個聲明中完成。 – 2009-01-16 19:08:08

+0

@Ates:它可以,但是如果你想正確地檢查邊界的話,imo不會沒有兩次調用`strlen()`,因此,你需要緩存這個值 - >兩個語句! – Christoph 2009-01-16 19:24:44

1

我會建議編寫一個函數, X字符並使用它來生成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); 

實際上,這就是阿泰貼,但其實我想通了這一點,我自己;)

9

您可以輕鬆地做到這一點與輸入輸出流代替了printf

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

或者,如果你真的需要使用fprintf中(比如,你通過FILE *寫入)

strstream str; 
str << setw(40) << setfill('.') << left << tag[i] << '[' << data[i] << ']' << endl; 
printf(%s", str.str()); 
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 ")); 
} 
相關問題