main()
{
char *a="#include<stdio.h>%cmain()%c{%c%cchar *a=%c%s%c;%c%cprintf(a,10,10,10,9,34,a,34,10,9,10,10,10);%c%cgetch();%c}";
printf(a,10,10,10,9,34,a,34,10,9,10,10,10);
getch();
}
這段代碼的功能是輸出自己的源代碼 必須使用頭文件
當初是看到蘭大acm培訓教材裏有這個題目
百思不得其解
只好去找答案了
網上的解釋:
上面的紅色的部分是定義一個字符型的指針a,指向的是引號裏面的字符串部分;
上面的藍色的部分是輸出字符型指針a所指向的地址裏的內容,也就是引號裏的內容;
printf(a,10,10,10,9,34,a,34,10,9,10,10,10);
這裏小括號內的第一個a是作爲輸出字符串的參數傳入的,後面的10,10,10,9,34,a,34,10,9,10,10,10都是作爲輸入格式控制的參數輸入的,也就是對應着#include<stdio.h>%cmain()%c{%c%cchar *a=%c%s%c;%c%cprintf(a,10,10,10,9,34,a,34,10,9,10,10,10);%c%cgetch();%c}裏面的那麼%c,%s,這些數字按字符輸出,它們對應的ASCII碼剛好是:
9 製表符
10 換行符
34 引號(")
32 空格
以下是我仿照改寫的c99標準版
從c99開始函數的返回值不再默認爲int
所以 main()是錯誤的寫法
而void main() 也是不合標準的寫法
可悲我們的教科書上還是一堆void main()
媽的 連個main函數都寫不對 還好意思來騙學生的錢
#include<stdio.h>
int main()
{
char *a=
"#include<stdio.h>%cint%cmain()%c{%c%cchar*a=%c%s%c;%c%cprintf(a,10,32,10,10,9,34,a,34,10,9,10,10,10,32,10);%c%cgetch();%creturn%c0;%c}";
printf(a,10,32,10,10,9,34,a,34,10,9,10,10,10,32,10);
getchar();
return 0;
}