Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的Quine程序示例_C_Quine - Fatal编程技术网

C语言中的Quine程序示例

C语言中的Quine程序示例,c,quine,C,Quine,在我的课程幻灯片中,我有一个例子,但没有太多解释: char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} 我明白一般的意思,但我不太明白上面代码中发生了什么。这是我运行时得到的输出: char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} 但它如何复制自己的代码呢?

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

char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
我明白一般的意思,但我不太明白上面代码中发生了什么。这是我运行时得到的输出:

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;同样,对于无函数参数)。 在此之前,是一个常规字符串。这是一个看起来很有趣的字符串,但它与
char*f=“fish”并没有多大区别

好的,那么如果我们通过手动将字符串放在那里来展开
printf

printf("char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c" ,34,f,34,10);
我们可以看到,它将打印出一些废话,并在此过程中替换一些值。它们是:

 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)
让我们也将它们全部替换(尽管我已经将字符串的内容替换为
,将
”替换为
\”
,以使其实际作为独立语句工作):

main()
{
printf(“char*f=\”\“main(){printf(f,34,f,34,10);}\n”);
}
好吧,看看这个
main
只需打印出我们第一次开始的行。万岁


编辑以添加:


虽然我基本上已经为你解释了答案,但仍然有一个谜团。想想为什么我们要在<代码> 34,f,34, 10 < />中替代,而不是像我在最后代码中那样直接把它们直接放进字符串中。

“如果我尝试编译它,我会得到一个分割错误。”如果编译时得到一个StrutsFor,那就是编译器错误。你的意思是说你在运行它时出错了吗?而且,这在现代C语言中不是一个完整的程序。不过,GCC会很高兴地编译它,并且似乎按预期运行。@ThomasJager我知道它不是一个完整的代码,但我复制了它,就像我的课堂讲稿一样,我只是试图理解它的功能。我试着在线运行它(在将它放入int main()之后),但是得到了一个分段错误(内核转储),所以是一个错误。这是整个程序。如果将它放在另一个函数中,您将无法使用它。当您将分号放入其他内容时,您是否在更改其他内容(例如在
main()
之后添加分号)?好吧,这部分是一个玩笑,但有一个严肃的观点:在我看来,这是你给学生们提供的一种期末趣味拼图,而不是“课程幻灯片”中的东西。生命对于这种胡说八道来说太短暂了,特别是因为你显然还没有被足够的教育去理解它。这是一个有效的但不是严格符合c89标准的程序。然而,它在现代c语言中是无效的,现代c语言的意思是不到20岁,谢谢你的解释!我只是想解释一下它是如何工作的。是不是因为如果我们直接将它们放入字符串中,它们首先会被读取为字符串,我们就不能将它们的值用于其他目的?(如果代码有其他部分)?不完全正确。如果希望输出包含引号,则需要将其打印出来。但是你不能把它们放在绳子上,因为那样会提前结束绳子。所以你必须逃离他们(就像我一样)。但是你必须打印转义字符,这些字符本身需要转义等等!
 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)
main()
{
    printf("char*f=\"<the string>\";main(){printf(f,34,f,34,10);}\n");
}