2011-10-07 57 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); 
    } 
} 
相关问题