参见英文答案 >
What is the use of the %n format specifier in C? 10个
我一直在学习格式字符串漏洞,这是我第一次听说过%n.我不明白为什么它存在.
好的,当然,我可以想象你想知道你到目前为止写过多少个字的情况.但是还有很多其他方法可以找到字符串的长度,而%n似乎是一种奇怪的方法.它与所有其他格式说明符不同,因为它不会写入字符串,而是写入内存中的其他手动指定位置.而且因为它太不直观了 – 谁会期望printf写入任意内存? – 它似乎具有创建安全漏洞的明显潜力.除非有人警告你格式化字符串漏洞,否则你可能永远不会想到它.
一定有这样做的理由.但它是什么?或者上面描述的问题当时不被认为是严重的?
最佳答案 如
This question所示,它实际上并没有将它的值存储在随机存储器中.
Nothing printed. The argument must be a pointer to a signed int, where the number of characters written so far is stored.
#include <stdio.h>
int main()
{
int val;
printf("blah %n blah\n", &val);
printf("val = %d\n", val);
return 0;
}
如果您想知道何时在控制台上换行,想要对齐您的值以及您希望对输出执行的其他格式化过程,则此参数非常有用.