C/C++ program that prints its own source code as its output

后端 未结 8 2314
天命终不由人
天命终不由人 2020-11-29 08:25

Wikipedia says it\'s called a quine and someone gave the code below:

char*s=\"char*s=%c%s%c;main(){printf(s,34,s,34);}\";main(){printf(s,34,s,34);}
         


        
8条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-29 09:11

    Here's a version that will be accepted by C++ compilers:

    #include
    const char*s="#include%cconst char*s=%c%s%c;int main(int,char**){printf(s,10,34,s,34);return 0;}";int main(int,char**){printf(s,10,34,s,34);return 0;}
    

    test run:

    $ /usr/bin/g++ -o quine quine.cpp
    $ ./quine | diff quine.cpp - && echo 'it is a quine' || echo 'it is not a quine'
    it is a quine
    

    The string s contains mostly a copy of the source, except for the content of s itself - instead it has %c%s%c there.

    The trick is that in the printf call, the string s is used both as format and as the replacement for the %s. This causes printf to put it also into the definition of s (on the output text, that is)

    the additional 10 and 34s correspond to the linefeed and " string delimiter. They are inserted by printf as replacements of the %cs, because they would require an additional \ in the format-string, which would cause the format- and replacement-string to differ, so the trick wouldn't work anymore.

提交回复
热议问题