用C 语言打印程序自身代码

这次实验是写个自己写代码的程序,而第一步就是这个程序先能打印出自己的代码。

打印自身代码的程序如下:

#include <stdio.h>
int main() 
{ 
    char *str = "#include <stdio.h>%cint main() %c{ %c    char *str = %c%s%c; %c    printf( str, 10, 10, 10, 34, str, 34, 10, 10, 10 ); %c    return 0; %c}"; 
    printf( str, 10, 10, 10, 34, str, 34, 10, 10, 10 ); // ASCII中,10为换行键,34为引号
    return 0; 
}

gcc 编译后,执行显示如下:

1.png

看的很乱,不过不要紧,慢慢分析:主要是第4行和第5行。

首先看第4行,就是一个字符串 (*str) ,这段字符串是程序整个代码的框架。

再看第5行,在ASCII中,10为换行键,34为引号,整个代码有7行,6个换行键,故第5句 printf 中,有6个10;至于两个34所代表的引号,则是第4句代表字符串的引号。

那么,剩下的两个字符串指针str代表的是什么呢?我们来改一下之前的代码,把第二个str删掉。

#include <stdio.h>
int main() 
{ 
    char *str = "#include <stdio.h>%cint main() %c{ %c    char *str = %c%c; %c    printf( str, 10, 10, 10, 34, str, 34, 10, 10, 10 ); %c    return 0; %c}"; 
    printf( str, 10, 10, 10, 34, 34, 10, 10, 10 ); // ASCII中,10为换行键,34为引号
    return 0; 
}

这段代码较之前面的代码,做出了如下更改,第4句删掉了%s ,第5句删掉了第二个str,也就是说,这次显示的是第一个str的输出,gcc编译后执行结果如下:

2.png

我们与第一次执行后的结果进行对比,会发现,只有第四句发生了改变,所以可以证明,程序的第五句中,printf的第2个字符串指针str,是 *str 自身的内容,在第二个str中,%c,%s 只是相当于字符串输出,没有任何特殊意义;而第一个str中,%c对应着10,%s对应着第二个str,输出的是整个程序的代码框架。

我的疑问:为什么第一个str输出的是代码框架,第二个才是str自身呢?*

希望得到指点,谢谢!

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 128,942评论 18 137
  • 版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...
    gfson阅读 1,790评论 0 6
  • 万事皆有规矩 无规不成方圆 病人也一样 到医院看病也应该有规矩 由于医院人多 你要排队 不能东闯西撞 也要注意安全...
    徐一村阅读 153评论 1 4
  • 一页新书茶一杯,晚风轻送夕阳回。 软软的晚风,轻轻的吹 吹过我头顶的天空 吹过故乡的天空 吹入童年 仿佛是梦 软软...
    彭征途阅读 188评论 0 0
  • 上次我们提到银行卡卡BIN,卡BIN是品牌的重要构成要素,谁的品牌谁转接,决定了交易路由。所以各个卡组织会向收单行...
    霍霍小哥阅读 744评论 0 0