| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1095 人关注过本帖
标题:转换说明符%n (printf(),scanf()...)
只看楼主 加入收藏
lucyqixi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-7-4
收藏
 问题点数:0 回复次数:7 
转换说明符%n (printf(),scanf()...)
[size=4]转换说明符%n的参数是一个int对象的地址,它向这个参数写入其所在字符串之前的字符数量.在printf(),scanf(),fprntf(),fscanf(),sprintf()中的作用相同,且不影响它们的返回值.[/size]#include<stdio.h>
#include<stdlib.h>
int main(void)
{
   FILE *fp;
   char strinre[]="12345";
   char strinwr[50];
   int numa,numb,numc,numd;
   
   scanf("%s%n",strinwr,&numa);
   printf("ab%ncdef%n\n%s%n\n",&numb,&numc,strinwr,&numd);
   printf("numa==%d   numb==%d   numc==%d   numd==%d\n",numa,numb,numc,numd);
   if((fp=fopen("work","w+"))==NULL)
     exit(1);
   fprintf(fp,"%s%nabc",strinre,&numa);
   printf("%d\n",numa);
    rewind(fp);
   fscanf(fp,"%s%n",strinwr,&numb);
   printf("%s   %d\n",strinwr,numb);
   return 0;
}
Welcome!
abcdef
Welcome!
numa==8   numb==2   numc==6   numd==15
5
12345abc   8

gcc 4.2.1,Digital Mars C 8.50,turbo c 2上编译成功.

VC++2005上没通过.

C89/C99上定义的标准转换说明符.

[[it] 本帖最后由 lucyqixi 于 2008-6-2 09:08 编辑 [/it]]
搜索更多相关主题的帖子: printf scanf 
2008-05-30 17:10
卖血上网
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-05-31 13:30
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
很普通的代码啊,相信所有C教程里都会说到

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-05-31 13:37
prinse
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-4-8
收藏
得分:0 
库函数是实现相关的,所以 %n 也不是到处都被支持。再说这个格式符的使用还要格外的小心。譬如在楼主的例子中,输入时有几个前导空白符,那么由 %n 得到的输入字符个数就不好用了。可能是这些或者还有什么别的原因,许多C教程都不想多说甚至不说这个格式符。还有一点需要说明的,如果考虑运行效率的话,有很多更好的选择。
2008-06-01 15:11
Loli
Rank: 1
来 自:飞燕算法群46520219
等 级:新手上路
帖 子:348
专家分:0
注 册:2008-5-27
收藏
得分:0 
目前就GCC支持吧


[color=white]
2008-06-01 15:29
lucyqixi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-7-4
收藏
得分:0 
不止GCC,上面列出来的那些都支持.因为在C89标准的时候就有了.我也是偶然在翻C99标准的时候发现的.空白字符也是字符,只是在SCANF中,使用%S会跳过前面的空白字符,如果有的话,%N仍然计数.至于具体有什么实际作用,我也没发现,不过还有什么更有效率的方法能实现这样任意位置的计数,我也没发现.
2008-06-02 09:19
meayer
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-9-13
收藏
得分:0 
printf("ab%ncdef%n\n%s%n\n",&numb,&numc,strinwr,&numd);
汗一个...........这句话你是想干什么?
2008-09-13 02:04
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
据说这样容易被缓冲区溢出攻击呢……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-13 23:23
快速回复:转换说明符%n (printf(),scanf()...)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024277 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved