web-dev-qa-db-ja.com

`printf"%s "`が次の2つの文字列を連結するのはなぜですか?

$ printf "%s" a b
ab$ printf "%s%s" a b
ab

printfの形式指定子を理解するのに問題があります。私が正しければ、Cプログラミング言語の文字列の場合とほとんど同じです。

書式指定子%sが次の2つの文字列を連結するのはなぜですか?

なぜ%sは、それを置き換える文字列が1つしかないことを意味せず、残りの文字列を無視するのですか?

%s%s%sの2つの文字列の結果が同じになるのはなぜですか?

10
Ben

それは printfの動作を指定する方法

formatオペランドは、引数を満たすために必要なだけ再利用されますオペランド。追加のb、c、またはs変換指定子は、null文字列引数が指定されたかのように評価されます。他の追加の変換指定は、引数がゼロであるかのように評価されます。 formatオペランドに変換指定が含まれておらず、argumentオペランドが存在する場合、結果は不定です。

あなたの場合、%s形式は、すべての引数を処理するために必要な回数だけ繰り返されます。

printf "%s" a b

そして

printf "%s%s" a b

最初のケースでは、%sが2回繰り返されるため、同じ結果が生成されます。これは、%s%sと同等です。

14
Stephen Kitt

printfに、フォーマット文字列が予期するよりも多くのパラメーターを指定すると、フォーマット文字列が繰り返されます。

例えば

$ printf "%s -- %s" a b c d e
a -- bc -- de -- 

%s -- %s形式は効果的に繰り返されます。

これは便利です。例:フォーマット

$ printf "%s -- %s\n" a b c d e
a -- b
c -- d
e -- 
8
Stephen Harris