| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 485 人关注过本帖
标题:转换说明符%n (printf(),scanf()...)
收藏  订阅  推荐  打印 
本主题由 卧龙孔明 于 2008-5-31 08:50 审核通过
lucyqixi
Rank: 1
等级:新手上路
帖子:7
积分:174
注册:2007-7-4
转换说明符%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上定义的标准转换说明符.

[ 本帖最后由 lucyqixi 于 2008-6-2 09:08 编辑 ]
搜索更多相关主题的帖子: printf  scanf  
2008-5-30 17:10
卖血上网
Rank: 1
等级:新手上路
帖子:16
积分:272
注册:2008-5-29

这帖都没人顶么   寒心
2008-5-31 13:30
flyue
Rank: 6Rank: 6
等级:金牌会员
威望:6
帖子:1721
积分:17882
注册:2006-6-20

很普通的代码啊,相信所有C教程里都会说到

大家一起来编程吧!
2008-5-31 13:37
prinse
Rank: 1
等级:新手上路
帖子:19
积分:346
注册:2008-4-8

库函数是实现相关的,所以 %n 也不是到处都被支持。再说这个格式符的使用还要格外的小心。譬如在楼主的例子中,输入时有几个前导空白符,那么由 %n 得到的输入字符个数就不好用了。可能是这些或者还有什么别的原因,许多C教程都不想多说甚至不说这个格式符。还有一点需要说明的,如果考虑运行效率的话,有很多更好的选择。
2008-6-1 15:11
Loli
Rank: 3Rank: 3
来自:飞燕算法群46520219
等级:中级会员
帖子:348
积分:3862
注册:2008-5-27

目前就GCC支持吧


[color=white]

论坛http://yzfy.org 我的QQ号1007665007
Loli算法讨论QQ群: 3996098(每周有教学课) 46520219 57909089
2008-6-1 15:29
lucyqixi
Rank: 1
等级:新手上路
帖子:7
积分:174
注册:2007-7-4

不止GCC,上面列出来的那些都支持.因为在C89标准的时候就有了.我也是偶然在翻C99标准的时候发现的.空白字符也是字符,只是在SCANF中,使用%S会跳过前面的空白字符,如果有的话,%N仍然计数.至于具体有什么实际作用,我也没发现,不过还有什么更有效率的方法能实现这样任意位置的计数,我也没发现.
2008-6-2 09:19
meayer
Rank: 1
等级:新手上路
帖子:6
积分:160
注册:2008-9-13

printf("ab%ncdef%n\n%s%n\n",&numb,&numc,strinwr,&numd);
汗一个...........这句话你是想干什么?
2008-9-13 02:04
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26219
注册:2007-11-16

据说这样容易被缓冲区溢出攻击呢……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-9-13 23:23
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.057030 second(s), 10 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved