【问题标题】:program that prints itself, how does it work?打印自己的程序,它是如何工作的?
【发布时间】:2011-10-07 17:39:58
【问题描述】:

我遇到了一个在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 格式说明符来允许打印出特殊字符 像换行符,否则不能嵌入到输出中 字符串。

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

【问题讨论】:

  • 我最近多次看到这个问题。这是家庭作业还是程序员挑战?
  • 没有这样的,我只是偶然发现的。如果是作业,我会使用作业标签。
  • 您的 cmets 打破了 quine :) 此外,quine 中的缩进也不正确。 this is my most recent quine in c++@MichaelDorgan: 是的,这是一个有历史根源的程序员挑战
  • 我更喜欢这个版本:main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}(末尾没有换行符)。

标签: c quine


【解决方案1】:
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 和字符串参数的格式说明符。

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 码(将转换为字符双引号)
  • 10 ,为第三个 %c 传递 10 个 ASCII 码(将转换为字符换行符)
  • 10 ,为第 4 个 %c 传递 10 个 ASCII 码(将转换为字符换行符)
  • 10 ,为第 5 个 %c 传递 10 个 ASCII 码(将转换为字符换行符)
  • 10 , 为第 6 个 %c 传递 10 个 ASCII 码(将转换为字符换行符)
  • 10 ,为第 7 个 %c 传递 10 个 ASCII 码(将转换为字符换行符)
  • 10 ,为第 8 个 %c 传递 10 个 ASCII 码(将转换为字符换行符)

【讨论】:

    【解决方案2】:

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

    %s 表示参数是一个字符串,%c 是一个字符。

    正如注释所说,它使用 %s 在程序字符串中打印程序字符串的副本 - 因此制作副本,并使用 %c 打印字符 10(新行)和 34 "

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        这可以使用文件处理来完成。以任何名称保存程序并将该名称放在 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);
             }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-03-05
          • 2020-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-06
          • 1970-01-01
          相关资源
          最近更新 更多