在单个 printf 调用中实现 tic-tac-toe
一个 tic-tac-toe 的 C 实现,只需一次调用 printf。为 IOCCC 2020 编写。
…如果您喜欢这种内容,您可能还会喜欢 printbf。
7 | 8 | 9 如果以下情况发生,游戏结束:
整个程序只包含一次对 printf 的调用。 int main() { while(*d) printf(fmt, arg); }
这里,fmt 是一个单个字符串,arg 是一系列要传给 printf 的参数。虽然其主要用途是作为 The One True Debugger,printf 也恰好是图灵完备的(参见 "Control-Flow Bending: On the Effectiveness of Control-Flow Integrity",我们在一篇实际的、已发表的学术论文中介绍了这一点。有时你可以做到的事情)。我们利用这个事实来在一个 printf 调用(以及一个用于读取用户输入的 scanf() 调用)中实现 tic-tac-toe 的逻辑。
此程序使用了三个 printf 格式指定符。 - %d 接收一个整数参数并将其打印出来 - %s 接收一个字符串参数并将其打印出来 - %n 接收一个指针并写入 (!!) 到目前为止打印的字节数。 好了,大家可能都知道这些。 让我们更进一步。 格式指定符可以接收额外的"参数"。 - "%hhn": 将写入的字节数 mod 256 存储到 char 指针中 - "%2$d": 将参数 2 打印到 printf 中(而不是顺序下一个参数) - "%8d": 将打印的整数填充到 8 个字符 - "%3$.*4$d": 将参数 3 打印到 printf 中,并使用参数 4 中的零数量。 例如,以下表达式
将产生与以下代码相同的效果:
暂无开放 Issues,或尚未同步最近议题。