2011-07-10 59 views
0

我正在打印一系列線條。線條的長度是不同的。有時我必須在線條的末端添加空格以對齊線條。並且在每行的末尾添加「\ n」字符。問題在於「\ n」後面的新行似乎在下一行的一些空格後面開始。它很奇怪。任何建議或意見表示讚賞。c printf漂亮打印格式

switch(struct.var1) { 
    case 0: 
switch(struct.var2) 
{ 
case 1: printf("xyx");break; 
case 2: printf("abc");break; 
} 
break; 
case 2: printf("xyz");break; 
case 3: printf("xyz");break; 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
case n: printf("XYZ   ");break; 
case m:printf("ABC   ");break; 
case 0xff: 
switch(struct.var2) 
{ 
    case 1: printf("MNO "); 
    case 2: printf("QRS "); 
} 
}//end of switch case. 

printf("\n"); 

請找到上面的代碼片段。這顯然是printf的對齊問題。我無法真正發現代碼的任何問題。

+6

我們可以看到一些代碼嗎? – emboss

+4

你可以發佈打印,預期輸出和實際輸出的代碼片段嗎? –

+0

開關(struct.var1){ 情況下0: \t開關(struct.var2) \t { \t殼體1:輸出( 「XYX」);打破; \t案例2:printf(「abc」); break; \t} \t break; \t案例2:printf(「xyz」); break;案例3:printf(「xyz」); break; \t。 \t。 \t。 \t。 \t。 \t。 \t。 \t。 \t。 \t。 \t。 \t。 \t。 \t。 \t case n:printf(「XYZ」); break; \t case m:printf(「ABC」); break; \t 0xff的情況下: \t開關(struct.var2) \t { \t \t殼體1:輸出( 「MNO」); \t \t案例2:printf(「QRS」); \t} \t} //結束切換案例。 \t printf(「\ n」); – liv2hak

回答

2

您發佈的代碼不足以診斷問題,但我的建議是避開它。不要在字符串之後打印空格來進行對齊,而要爲字符串指定正確寬度的字段。

另外一點我會做會使用,而不是一個switch語句的數組,如果可以的話:

char *strings[256][2] = { 
    {"xyz", "abc"}, 
    // ... 
    {"MNO", "QRS"} 
}; 

// print selected string left justified in a 7-character wide field. 
printf("%-7s\n", strings[struct.var1][struct.var2]); 

目前尚不清楚,從你的代碼已經發布是否涉及選擇的值這些字符串完全是連續的。如果它們不是連續的,但仍然相當密集(即,你使用的是大多數但不是全部的值),用空字符串填充未使用的點並且仍然使用數組可能是最容易的。

2

你在Windows上嗎?您可能需要在字符串末尾添加\r以及\n

+3

你不應該。根據C標準,'\ n'應該始終工作。 –

+0

哦。哦,只是一個猜測。 – Whatang

+0

更具體地說,'\ n'本身就是以文本模式打開的流的正確行結束字符,標準輸出流默認以文本模式打開。 – caf