C中%n格式说明符的用途是什么?

%nC中格式说明符的用途是什么?有人可以举例说明吗?



猛跑小猪
浏览 3486回答 3
3回答

慕尼黑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(){&nbsp; int val;&nbsp; printf("blah %n blah\n", &val);&nbsp; printf("val = %d\n", val);&nbsp; return 0;}先前的代码显示:blah&nbsp; blahval = 5

海绵宝宝撒

我还没有真正看到过该%n说明符在现实世界中的许多实际用途,但是我记得它在很久以前就曾用于格式字符串攻击的老式printf漏洞中。这样的事情void authorizeUser( char * username, char * password){&nbsp; &nbsp; ...code here setting authorized to false...&nbsp; &nbsp; printf(username);&nbsp; &nbsp; if ( authorized ) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;giveControl(username);&nbsp; &nbsp; }}其中,恶意用户可能会获得通过到的printf作为格式字符串获取用户名参数的优势和使用的组合%d,%c或W / E去通过调用栈,然后修改授权的真实值的变量。是的,这是一种深奥的用法,但是在编写守护程序以避免安全漏洞时总是有用的吗?:D
打开App,查看更多内容
随时随地看视频慕课网APP