用C 語(yǔ)言打印程序自身代碼

這次實(shí)驗(yàn)是寫(xiě)個(gè)自己寫(xiě)代碼的程序,而第一步就是這個(gè)程序先能打印出自己的代碼。

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

#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為引號(hào)
    return 0; 
}

?

gcc 編譯后,執(zhí)行顯示如下:

1.png

看的很亂,不過(guò)不要緊,慢慢分析:主要是第4行和第5行。

首先看第4行,就是一個(gè)字符串 (*str) ,這段字符串是程序整個(gè)代碼的框架。

再看第5行,在ASCII中,10為換行鍵,34為引號(hào),整個(gè)代碼有7行,6個(gè)換行鍵,故第5句 printf 中,有6個(gè)10;至于兩個(gè)34所代表的引號(hào),則是第4句代表字符串的引號(hào)。

那么,剩下的兩個(gè)字符串指針str代表的是什么呢?我們來(lái)改一下之前的代碼,把第二個(gè)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為引號(hào)
    return 0; 
}

這段代碼較之前面的代碼,做出了如下更改,第4句刪掉了%s ,第5句刪掉了第二個(gè)str,也就是說(shuō),這次顯示的是第一個(gè)str的輸出,gcc編譯后執(zhí)行結(jié)果如下:

2.png

我們與第一次執(zhí)行后的結(jié)果進(jìn)行對(duì)比,會(huì)發(fā)現(xiàn),只有第四句發(fā)生了改變,所以可以證明,程序的第五句中,printf的第2個(gè)字符串指針str,是 *str 自身的內(nèi)容,在第二個(gè)str中,%c,%s 只是相當(dāng)于字符串輸出,沒(méi)有任何特殊意義;而第一個(gè)str中,%c對(duì)應(yīng)著10,%s對(duì)應(yīng)著第二個(gè)str,輸出的是整個(gè)程序的代碼框架。

我的疑問(wèn):為什么第一個(gè)str輸出的是代碼框架,第二個(gè)才是str自身呢?*

希望得到指點(diǎn),謝謝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評(píng)論 19 139
  • 版權(quán)聲明:本文為 gfson 原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。注:作者水平有限,文中如有不恰當(dāng)之處,請(qǐng)予以指正,萬(wàn)分感謝...
    gfson閱讀 3,489評(píng)論 0 6
  • 萬(wàn)事皆有規(guī)矩 無(wú)規(guī)不成方圓 病人也一樣 到醫(yī)院看病也應(yīng)該有規(guī)矩 由于醫(yī)院人多 你要排隊(duì) 不能東闖西撞 也要注意安全...
    徐一村閱讀 358評(píng)論 1 4
  • 一頁(yè)新書(shū)茶一杯,晚風(fēng)輕送夕陽(yáng)回。 軟軟的晚風(fēng),輕輕的吹 吹過(guò)我頭頂?shù)奶炜?吹過(guò)故鄉(xiāng)的天空 吹入童年 仿佛是夢(mèng) 軟軟...
    彭征途閱讀 312評(píng)論 0 0
  • 上次我們提到銀行卡卡BIN,卡BIN是品牌的重要構(gòu)成要素,誰(shuí)的品牌誰(shuí)轉(zhuǎn)接,決定了交易路由。所以各個(gè)卡組織會(huì)向收單行...
    霍霍小哥閱讀 1,482評(píng)論 0 0

友情鏈接更多精彩內(nèi)容