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

Tim*_*Tim 10 bash printf

$ printf "%s" a b
ab$ printf "%s%s" a b
ab
Run Code Online (Sandbox Code Playgroud)

我在理解printf. 如果我是对的,它与 C 编程语言中的字符串大致相同。

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

为什么不 %s意味着只有一个字符串来替代它,而忽略剩余的字符串?

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

Ste*_*itt 14

这是如何printf指定的行为

格式的操作应视需要经常重复使用,以满足参数操作数。任何额外的 b、c 或 s 转换说明符都应像提供空字符串参数一样进行评估;其他额外的转换规范应该被评估,就像提供了一个零参数一样。如果格式操作数不包含转换规范并且存在参数操作数,则结果未指定。

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

printf "%s" a b
Run Code Online (Sandbox Code Playgroud)

printf "%s%s" a b
Run Code Online (Sandbox Code Playgroud)

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

  • 不,它没有——它忽略了额外的参数。现代 C 编译器会警告格式字符串和参数之间的不匹配。 (6认同)
  • @Ben 在 C 中,`printf` 函数是一个 [variadic 函数](https://en.cppreference.com/w/c/variadic):除了第一个参数之外的所有参数都通过 `...` 接受。这意味着除非通过第一个参数告诉存在多少(以及哪些类型),否则函数**永远**不知道调用者传递给它的内容。在 shell 中,命令确切地知道它有多少命令行参数。 (5认同)

Ste*_*ris 8

如果您提供的参数printf多于格式字符串的预期,则格式字符串将重复。

例如

$ printf "%s -- %s" a b c d e
a -- bc -- de -- 
Run Code Online (Sandbox Code Playgroud)

我们可以看到%s -- %s格式被有效地重复了。

这很有用;例如用于格式化

$ printf "%s -- %s\n" a b c d e
a -- b
c -- d
e -- 
Run Code Online (Sandbox Code Playgroud)