| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 392 人关注过本帖
标题:哪位大神能帮我解释解释?挺急的!!
只看楼主 加入收藏
穿袜子的傻喵
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-4-21
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:4 
哪位大神能帮我解释解释?挺急的!!
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-06-16 16:46
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:2 
会用换元法解多元方程吗?会的话就简单了.先看printf()的原型:
int __cdecl printf(const char * __restrict__ _Format,...);

printf()的第一个参数是个字符指针类型的,也就是第一个逗号之前的部分,后面的不再这样认为了.
再看原来的代码:
main(){
    char *a="main(){char *a=%c%s%c;printf(a,34,a,34);}";
    printf(a,34,a,34);
    }

a是一个字符指针, printf()的第一个参数也是指针,把a代入printf()后得到:
printf(main(){char *a=%c%s%c;printf(a,34,a,34);},34,a,34);

这样明白了吗? printf()第一个逗号前的东西都会原样输出, 遇到%c%s%c后就和后面的东西配对解析. %c对应两个34, ASCII码34号就是'"', 而%s对应a. 所以输出就是:
程序代码:
main(){char *a=%c\         //这个%c对应第一个34, 被转化为'"'
%s\                        //这个%s对应char *a="main(){char *a=%c%s%c;printf(a,34,a,34);}";中a的内容, 不包括'"'
%c\                        //这个%c和第一个一样,被转化为'"'
;printf(a,34,a,34);}

个人理解.

[ 本帖最后由 vvvcuu 于 2015-6-16 19:04 编辑 ]

代码测试环境:  WinXP+C-Free5.0.
2015-06-16 19:00
穿袜子的傻喵
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2015-4-21
收藏
得分:0 
回复 2楼 vvvcuu
为什么程序会遇到%c%s%c?它不是照原样输出了吗?
2015-06-16 20:47
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:0 
真是一段有趣的代码


莫问前尘有愧,但求今生无悔
2015-06-16 22:02
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:3 
回复 3楼 穿袜子的傻喵
printf()的第一个参数是一个字符串, 当显式给出的时候需要双引号, 比如说
printf("i=%d,c=%d",i,c);
等.

但是,如果以数组或者指针的形式给出的时候, 只需要提供数组名或者指针名字就可以了,无需双引号.  比如说
char *a="shgrhgrug";printf(a);


对于第一个参数中遇到的%都会根据其后面跟的一个或者几个字符进行转义.  原代码中的%c%s%c属于转义字符,根据后面的参数确定了意义.所以不会直接输出.

代码测试环境:  WinXP+C-Free5.0.
2015-06-16 22:27
快速回复:哪位大神能帮我解释解释?挺急的!!
数据加载中...
 
   



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

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