Ошибка в Quine, написанная только на C, печатает до последней строки кода, заключенного в кавычки - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь написать квинну на основе кода Java в этой статье Википедии .Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

void print(int x)
{
    char * buf = itoa(x,NULL,10);
    puts(buf);
}

int main(void)
{
    rsize_t opening = 15;
    rsize_t i = 0;
    char  * q[] = 
    {
"#include <stdio.h>",
"#include <stdlib.h>",
"#include <stdint.h>",
"",
"void printf(int x)",
"{",
"   char * buf = itoa(x,NULL,10);",
"   puts(buf);",
"}",
"",
"int main(void)",
"{",
"   rsize_t opening = 15",
"   rsize_t i = 0;",
"   char  * q[] =",
"   {",
"   };",
"   while (i <= opening)",
"   {",
"       printf(q[i]);putchar(10);i++;",
"   }",
"   i = 0;",
"   while (q[i] != NULL)",
"   {",
"       putchar(34);printf(q[i]);putchar(34);putchar(44);putchar(10);i++;",
"   }",
"   i = opening+1;",
"   while (q[i] != NULL)",
"   {",
"       printf(q[i]);putchar(10);i++;",
"   }",
"   return 0;",
"}",
    };
    while (i <= opening)
    {
        printf(q[i]);putchar(10);i++;
    }
    i = 0;
    while (q[i] != NULL)
    {
        putchar(34);printf(q[i]);putchar(34);putchar(44);putchar(10);i++;
    }

    i = opening+1;
    while ( q[i] != NULL )
    {
        printf(q[i]);putchar(10);i++;
    }
    return 0;
}

Вывод этой программы следующий:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

void printf(int x)
{
        char * buf = itoa(x,NULL,10);
        puts(buf);
}

int main(void)
{
        rsize_t opening = 15
        rsize_t i = 0;
        char  * q[] =
        {
"#include <stdio.h>",
"#include <stdlib.h>",
"#include <stdint.h>",
"",
"void printf(int x)",
"{",
"       char * buf = itoa(x,NULL,10);",
"       puts(buf);",
"}",
"",
"int main(void)",
"{",
"       rsize_t opening = 15",
"       rsize_t i = 0;",
"       char  * q[] =",
"       {",
"       };",
"       while (i <= opening)",
"       {",
"               printf(q[i]);putchar(10);i++;",
"       }",
"       i = 0;",
"       while (q[i] != NULL)",
"       {",
"               putchar(34);printf(q[i]);putchar(34);putchar(44);putchar(10);i++;",
"       }",
"       i = opening+1;",
"       while (q[i] != NULL)",
"       {",
"               printf(q[i]);putchar(10);i++;",
"       }",
"       return 0;",
"}",
"",

Как мы видим, программа просто прекращает печатать сразу после печати последней новой строкизавернутые в кавычки и сопровождаемые запятой: ("",).Предполагалось напечатать заключительную скобку (};) для массива (char * q []), за которой следуют все три цикла while без их оборачивания в видимые кавычки для завершения печати квин.В прошлом мне приходилось укорачивать строки кода, чтобы позволить квине завершить печать.Поэтому меня удивляет, что у меня возникла такая проблема с написанием квайна еще раз.

...