2011-10-07 16 views
15

我遇到了一個程序,它打印在this網站上,即它打印程序代碼。打印自己的程序,它是如何工作的?

程序代碼是:

#include <stdio.h> 
char *program = "#include <stdio.h>%cchar *program = %c%s%c;%cint main()%c{%cprintf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);%c return 0;%c}%c"; 
//what is this line doing, what is the use of %c and %s and what properties of %c and %s are being used here? 
int main() 
{ 
     printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); 
     //what is this print function doing, and how? 
     return 0; 
} 

而且給出的解釋是:

兩個關鍵技巧在這裏使用了嵌入式%S 說明符的字符串,使字符串包含本身打印時,並使用%c格式說明符 允許打印出像換行符那樣的特殊字符 ,否則該字符串不能嵌入輸出 字符串中。

我不明白該程序是如何工作的。我已經提到了我需要的解釋,他們是如何工作的以及他們在做什麼。請解釋。

+0

我已經看到了這個問的次數最近。這是一個家庭作業或程序員的挑戰嗎? –

+0

沒有這樣的事,我只是碰到它。如果這是一個家庭作業,我會使用作業標籤。 – SpeedBirdNine

+0

你的評論打破了奎因:)另外,縮進在奎因中是不正確的。 [這是我最近在C++中的quine](http://codepad.org/sKvDs2Et)@MichaelDorgan:是的,它是一個歷史根源的程序員的挑戰 – sehe

回答

6
char *program = "#include <stdio.h>%cchar *program = %c%s%c;%cint main()%c{%cprintf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10);%c return 0;%c}%c"; 

有一個char指針名稱「program」用於存儲字符串,%c和%s分別是char和string參數的格式說明符。

printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); 

printf函數被打印輸出到控制檯,10這裏是NEWLINE和ASCII代碼34爲「 printf的參數都在做

  • 程序,傳遞串要被打印
  • 10,傳遞首先%c的10位ASCII代碼(將轉換爲字符換行符)
  • 程序將同一字符串再次傳遞給程序中的%s以再次打印相同的字符串
  • 34,傳遞第二個%c的34個ASCII碼(將轉換爲字符雙重qoutes)
  • 10,傳遞10個ASCII代碼爲3%c(將轉換爲字符換行符)
  • 10,傳遞10個ASCII碼(將轉換爲字符換行符)
  • 10,傳遞10%ASCII代碼用於第5%c(將轉換爲字符換行符)
  • 10,傳遞10個ASCII代碼用於第6%c以字符換行)
  • 10,傳遞10個ASCII碼爲7%c(將轉換爲字符換行)
  • 10 ,經過10 ASCII碼爲8%C(將被轉換爲字符換行符)
+1

你忘了一個34. :-) –

2

printf的打印給定的作爲第一個參數(在*program字符串在這種情況下)代替位置有一個%s或%c中的其他參數的串

%s表示的arguement是一個字符串,%C是一個角色。

作爲音符說,它使用%s到打印程序串內的程序字符串的副本 - 因此製作副本,並使用%C打印的字符10(換行)和34 "

0

爲了更好地理解,變量program本來是這樣寫的:

"#include <stdio.h>\nchar *program = \"%s\";\nint main()\n..." 

的想法是,你運行程序,編譯它的輸出,運行程序等等。但是這隻能用換行的%c值10和雙引號的34來完成。

-1

這可以使用文件處理完成。用任意名稱保存程序,並將該名稱放在fopen命令的打開目錄中。 就像我的程序名是hello.cpp。

這是下面的程序

#include <stdio.h> 
#include <iostream> 
int main() 
{ 
    FILE *fp; 
    fp=fopen("hello.cpp","r"); 
    char ch; 
    while((ch=fgetc(fp))!=EOF) 
    { 
     printf("%c",ch); 
    } 
} 
相關問題