打印自己的程序,它是如何工作的?

我遇到了一个在这个网站上打印自己的程序,即打印程序代码。

程序代码是:

#include  char *program = "#include %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格式说明符允许打印出特殊字符,如换行符,否则无法嵌入到输出字符串。

我不明白该程序是如何工作的。 我已经提到了我需要解释的线条,它们如何工作以及它们在做什么。 请解释。

 char *program = "#include %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,传递34个ASCII码为第二个%c(将转换为字符双qoutes)
  • 10,传递10个ASCII代码为3%c(将转换为字符换行符)
  • 10,传递10个ASCII码为4%c(将转换为字符换行符)
  • 10,传递10个ASCII码为5%c(将转换为字符换行符)
  • 10,传递10个ASCII码为6%c(将转换为字符换行符)
  • 10,传递10个ASCII代码为7th%c(将转换为字符换行符)
  • 10,传递10个ASCII代码为8%c(将转换为字符换行符)

Printf打印作为第一个参数给出的字符串(在本例中为*program的字符串)替换其他具有%s或%c的参数

%s表示争论是一个字符串,%c是一个字符。

正如笔记所说,它使用%s在程序字符串中打印程序字符串的副本 – 从而制作副本,并使用%c打印字符10(新行)和34 "

为了更好地理解,变量program可以这样编写:

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

这个想法是,你运行程序,编译它的输出,运行程序,等等。 但这只能通过换行的%c值10和双引号的34来完成。

这可以使用文件处理来完成。 使用任何名称保存程序,并将该名称放在fopen命令的open目录中。 就像我的程序名称是hello.cpp。

这是以下程序

 #include  #include  int main() { FILE *fp; fp=fopen("hello.cpp","r"); char ch; while((ch=fgetc(fp))!=EOF) { printf("%c",ch); } }