[英]Why do printf and sprintf behave differently when only given an array?
sub do_printf { printf @_ }
sub do_sprintf { print sprintf @_ }
do_printf("%s\n", "ok"); # prints ok
do_sprintf("%s\n", "ok"); # prints 2
sprintf
有原型$@
而printf
有原型@
請參閱codeholic
和Mark
的答案,了解他們為什么表現不同。
作為一種解決方法,只需:
sub do_sprintf { print sprintf(shift, @_) }
然后,
sub do_printf { printf @_ }
sub do_sprintf { print sprintf(shift, @_) }
do_printf("%s\n", "ok"); # prints ok
do_sprintf("%s\n", "ok2"); # prints ok2
他們做不同的事情。 對於printf
輸出是到一個流; 對於sprintf
你想要構造的字符串。 它處理打印命令的格式 ( f )。 printf
的主要目的是打印出它構造給流的值,但是使用s(tring)printf(ormat)你只是試圖創建字符串,而不是打印它。
printf
返回打印到流中的字符數作為反饋。 一旦將字符打印到流中,它們就會從程序的邏輯結構中傳出。 與此同時, sprintf
需要將一條繩子交給你。 最方便的方法是作為返回值 - 因為它在程序結構中可以檢查長度,或者它是否包含任何'e'或任何你想要的。
他們為什么不應該表現得不一樣?
sprintf在標量上下文中計算數組。 您的數組有兩個元素,因此它的計算結果為“2”(沒有尾隨\\ n)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.