2017-05-26 63 views
4

我想將一個額外參數傳遞給printf並打印兩次,例如,printf參數兩次

printf("%s%s","somestring");  // prints somestringsomestring 

有沒有辦法做到這一點?

+2

https://stackoverflow.com/questions/19327441/gcc-dollar-sign-in-printf-format-string – Barmar

+2

在ISO C中,你需要使用一個變量(或可變參數列表)來保存值,然後在參數列表中指定兩次 –

+0

是否存在實際需要或者這是理論問題? – i486

回答

8

如果你在Linux或其他類UNIX系統,你可以使用$指定參數編號:

printf("%1$s%1$s\n", "hello"); 

在這個例子中,1$表示「使用第一個參數」。我們也多次使用這個語法,所以我們可以多次使用給定的參數。

Linux man page for printf提供了更多的細節:

的參數必須與 轉換說明正確對應(式推廣之後)。默認情況下,參數的使用順序爲 ,其中每個'*'和每個轉換說明符都會要求輸入下一個 參數(如果給出的參數數量不夠多,則會出現錯誤) 。通過寫入「%m $」而不是 '%'和'm $'而不是'',人們還可以明確地指定採用哪個參數,在 每個需要參數的地方,其中十進制整數m表示在期望的參數的參數列表中的位置 ,索引 從1開始。因此,

printf("%*d", width, num); 

printf("%2$*1$d", width, num); 

是等價的。第二種風格允許重複參考 相同的論點。 C99標準不包含使用來自單一UNIX規範的'$', 的樣式。如果使用使用'$' 的樣式,則必須始終將所有轉換採用 參數和所有寬度和精度參數進行所有轉換,但可能會將 與不佔用參數的「%%」格式混合使用。使用'$'指定的參數數量可能沒有 間隔;例如,如果指定了參數1和3的 ,則參數2也必須在格式字符串的某處指定爲 。

+0

非常感謝。將接受系統讓我的時間。 – DEADBEEF

+3

每個'man 3 printf'只需註釋一下:「* C99標準不包含使用'$'的樣式,該樣式來自Single UNIX Specification。*」 –

+2

^換句話說,這是一個POSIX擴展 –