首页 > 解决方案 > printf("%2$*11$s", ...) 这个格式是什么意思

问题描述

它像在 c11/c++ 中一样使用?:

printf("%2$*11$s",...)

它来自一个 elf 文件,这个文件使用 printf() 来像mem[4]=mem[2]+mem[1]. 您可以参考此https://ctftime.org/task/5042(这是一个反向 CTF 问题)。

就我而言,我知道 $ 用于指定哪个 var 的位置,但没有参考通知一个块可以有两个 $。

另外,除了位置之外,我在格式中找不到任何关于 $ 的函数。

所以,如果有人能告诉我这是有意义的,我将不胜感激。

图片

标签: c++cformatprintf

解决方案


n$是 POSIX 中定义的扩展,用于选择要打印的参数。这称为参数字段

printf 格式字符串 - 维基百科

实际上,这个问题是关于使用二合一n$格式说明符。让我用一些小例子来研究......

#include <stdio.h>

int main(void) {
    printf("%1$*3$s\n", "a", "b", 10, 20);
    printf("%1$*4$s\n", "a", "b", 10, 20);
    printf("%2$*3$s\n", "a", "b", 10, 20);
    printf("%2$*4$s\n", "a", "b", 10, 20);
    return 0;
}

输出

         a
                   a
         b
                   b

它看起来意味着“使用 -th 参数指定的宽度%n$*m$s打印-th 参数”。最后的意思是in 。nmss%s


推荐阅读