你只用到了 printf 的 10%:那些课堂没教的格式化技巧
文章摘要
这是一段技术科普视频,主题是大多数程序员对 C 语言 printf() 的使用其实只触及皮毛——标题打趣说「你只用到了 10%」。绝大部分人停留在 %d、%s、%f 这类基础占位符,而 printf 的格式化迷你语言里藏着许多在入门课上从不讲的功能。
视频涉及的「冷门但强大」的特性包括:位置参数(positional arguments)——用 %n$ 形式(如 %1$s、%2$d)显式指定要格式化的是参数列表中第几个参数,且同一参数可被重复引用,这在做国际化(不同语言语序不同)时尤为有用;%n 转换符——它不输出任何字符,而是把「到目前为止已输出的字符数」写回到对应的指针参数所指的地址;以及通过 * 在运行时动态指定宽度与精度(如 %*d)等技巧。
需要提醒的是,其中 %n 也是经典的 格式化字符串漏洞(format string vulnerability) 的核心——如果格式串可被攻击者控制,%n 就能被用来向任意内存地址写值,因此现代很多平台与编译器对它做了限制或默认禁用。这段视频更多是作为视频内容呈现,本文要点结合视频主题与 HN 讨论整理。
HN 评论精华
- db48x:一句精炼的「凡尔赛」——「等你听说 Common Lisp 的字符串格式化器(
format)再说吧。」言下之意是 Lisp 的~指令体系比 printf 复杂、强大得多,简直自成一门小语言。 - kelsolaar:表示视频很有启发,「从没想到这里头藏着这么多复杂性,不过事后想想又完全说得通」。
- apimade:该评论被标记为 [flagged](已被折叠 / 旗标),内容未予显示。
(注:该条目讨论较为冷清,有效评论不多;以上为 HN 上实际可见的全部主要发言。)