2012-12-19 40 views
0

我已經修改現有的代碼,其中有這樣的管分離輸出使用fprintf ...優化的方式

 fprintf (stdout, "%-30.30s",reason); 

許多fprintf中陳述但是現在,如果用戶在主參數傳遞的「T」,那麼我將打印輸出由分隔符「|」隔開

我在我的文件中有幾個fprint。

目前我已經採取了一個標誌,如果用戶想要管道分離輸出設置爲true。

if(flag) 
      fprintf (stdout, "%-30.30s|",reason); 
    else 
      fprintf (stdout, "%-30.30s",reason); 

如果還有其他更好的方法來實現這個,請建議我。請注意,我有幾個fprintf分散在我的文件中。

謝謝!

+0

我懷疑是否有其他方法,你做這件事的方式有什麼問題? –

回答

4
char *separator = flag ? "|" : ""; 

fprintf(stdout, "%-30.30s%s", reason, separator); 
+1

「優化」減少重複。我還沒有測量任何其他屬性。 – 2012-12-19 09:03:50

+0

另一種選擇是使用'char'和'%c'格式。它可能比'%s'稍快,因爲後者必須檢查'\ 0'。 –

+0

@MaximYegorushkin你不能打印零長度字符。您可以添加一個不可打印的字符,但可能會混淆下游工具。 – 2012-12-19 09:35:28

1

一個一個班輪:

fprintf (stdout, "%-30.30s%c",reason,(flag?'|':'\0')); 

對於多fprintf中的在你的代碼,你可以簡單地寫一個宏或內聯函數,以打印出基於一組參數。編寫一個包裝函數並用有效參數調用該包裝函數。根據你的程序規範(你的問題不清楚),你將不得不找到編寫包裝函數的最佳方法。

對於如:

把所有東西fprintf中像這樣的包裝功能,只與標誌,沒有的情況下調用。

//Illustrative purposes only 
void wrapper(int flag, int caseno,char* reason) 
{ 
if(reason!=NULL) 
switch(caseno) 
{ 
case 1: 
    fprintf(stdout,"xyz%s",reason); 
    break; 
case 2: 
    fprintf(stdout,"abc%s",reason); 
    break; 
... 
} 

fprintf (stdout, "%c",(flag?'|':'\0')); 

return; 
} 

既然你正在編寫錯誤O/P我會建議使用的stderr代替stdout