-
慕尼黑5688855
这些答案大多数都解释了%n 做什么(即不打印任何内容并将到目前为止已打印的字符数写入int变量),但是到目前为止,还没有人真正给出其用途的示例。这是一个:int n;printf("%s: %nFoo\n", "hello", &n);printf("%*sBar\n", n, "");将打印:hello: Foo BarFoo和Bar对齐。(在不使用%n此特定示例的情况下,这样做很简单,通常总会打断第一个printf调用:int n = printf("%s: ", "hello");printf("Foo\n");printf("%*sBar\n", n, "");稍微增加一点便利是否值得使用深奥的东西%n(可能会引入错误)值得商debate。
-
手掌心
什么都没打印。该参数必须是一个指向带符号的int的指针,该整数存储了到目前为止写入的字符数。#include <stdio.h>int main(){ int val; printf("blah %n blah\n", &val); printf("val = %d\n", val); return 0;}先前的代码显示:blah blahval = 5
-
海绵宝宝撒
我还没有真正看到过该%n说明符在现实世界中的许多实际用途,但是我记得它在很久以前就曾用于格式字符串攻击的老式printf漏洞中。这样的事情void authorizeUser( char * username, char * password){ ...code here setting authorized to false... printf(username); if ( authorized ) { giveControl(username); }}其中,恶意用户可能会获得通过到的printf作为格式字符串获取用户名参数的优势和使用的组合%d,%c或W / E去通过调用栈,然后修改授权的真实值的变量。是的,这是一种深奥的用法,但是在编写守护程序以避免安全漏洞时总是有用的吗?:D