为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
猛跑小猪 2019-10-16 10:41:13
%nC中格式说明符的用途是什么?有人可以举例说明吗?
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

这些答案大多数都解释了%n 做什么(即不打印任何内容并将到目前为止已打印的字符数写入int变量),但是到目前为止,还没有人真正给出其用途的示例。这是一个:


int n;

printf("%s: %nFoo\n", "hello", &n);

printf("%*sBar\n", n, "");

将打印:


hello: Foo

       Bar

Foo和Bar对齐。(在不使用%n此特定示例的情况下,这样做很简单,通常总会打断第一个printf调用:


int n = printf("%s: ", "hello");

printf("Foo\n");

printf("%*sBar\n", n, "");

稍微增加一点便利是否值得使用深奥的东西%n(可能会引入错误)值得商debate。


查看完整回答
1 反对 回复 2019-10-16
?
手掌心

TA贡献1942条经验 获得超3个赞

什么都没打印。该参数必须是一个指向带符号的int的指针,该整数存储了到目前为止写入的字符数。


#include <stdio.h>


int main()

{

  int val;


  printf("blah %n blah\n", &val);


  printf("val = %d\n", val);


  return 0;


}

先前的代码显示:


blah  blah

val = 5


查看完整回答
反对 回复 2019-10-16
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

我还没有真正看到过该%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


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 3639 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信