为什么 `printf "%s"` 将以下两个字符串连接在一起?

为什么 `printf "%s"` 将以下两个字符串连接在一起?
$ printf "%s" a b
ab$ printf "%s%s" a b
ab

我在理解 的格式说明符时遇到一些问题printf。如果我是正确的,它与 C 编程语言中的字符串基本相同。

为什么格式说明符%s将以下两个字符串连接在一起?

为什么 %s不表示只有一个字符串来替换它,而忽略剩余的字符串呢?

%s为什么两个字符串 under和 under 的结果%s%s相同?

答案1

那是指定如何printf行为:

格式操作数应根据需要重复使用以满足争论操作数。任何额外的 b、c 或 s 转换说明符都应按照提供空字符串参数的方式进行计算;其他额外的转换规范应像提供零参数一样进行评估。如果格式操作数不包含转换规范并且争论存在操作数,但结果未指定。

在您的情况下,该%s格式会根据需要重复多次以处理所有参数。

printf "%s" a b

printf "%s%s" a b

产生相同的结果,因为在第一种情况下%s重复两次,相当于%s%s

答案2

如果您提供的参数多于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 -- 

相关内容