首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C语言编写Quine程序实例

用C语言编写Quine程序实例
EN

Stack Overflow用户
提问于 2020-02-13 16:41:21
回答 1查看 1.5K关注 0票数 0

在我的课程幻灯片中,我有这个例子,但是没有太多的解释:

代码语言:javascript
复制
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}

我理解quine程序的一般含义,但我不太理解上面的代码中发生了什么。这是我运行它时得到的输出:

代码语言:javascript
复制
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}

但是它是如何复制自己的代码的呢?我真不明白产出是怎么产生的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-13 17:04:05

首先,以一种更清晰的方式写出它(只改变布局):

代码语言:javascript
复制
char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";

main()
{
    printf(f,34,f,34,10);
}

因此,我们看到了一个main函数(它应该返回一个int,但是您可以在C中使用not;同样,如果没有函数参数,也可以这样做)。在那之前,一根普通的绳子。这是一个看起来很有趣的字符串,但与char*f="fish";并没有太大的不同。

好吧,如果我们用手把字符串放进去来扩展printf呢?

代码语言:javascript
复制
printf("char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c" ,34,f,34,10);

我们可以看到,它会打印出一些废话,并在过程中用一些值替代。它们是:

代码语言:javascript
复制
 First %c : 34   (the ASCII code for " (quotes))
 First %s : 'f'  (our string, once again)
Second %c : 34   (" again) 
 Third %c : 10   (the ASCII code for Newline)

那么,让我们替换所有这些内容(虽然我用<the string>替换了字符串的内容,"\"替换了字符串的内容,以使它实际上作为独立的语句工作):

代码语言:javascript
复制
main()
{
    printf("char*f=\"<the string>\";main(){printf(f,34,f,34,10);}\n");
}

好吧,看看这个!main只是打印出我们第一次开始使用的行。太棒了!

编辑后添加:

虽然我基本上已经为你说出了答案,但仍然有一个谜题。考虑一下为什么我们要在34, f, 34, 10中进行替换,而不是像我在最后的代码中那样直接将它们放入字符串中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60212717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档