2011-10-07 11 views
15

Encontré un programa que se imprime en el sitio this, es decir, imprime el código del programa.programa que se imprime a sí mismo, ¿cómo funciona?

El código del programa es:

#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; 
} 

Y la explicación dada es:

Los dos trucos clave aquí está usando una cadena con un% incrustado s especificador para permitir que la cadena que contiene sí mismo cuando se imprime, y al utilice el especificador de formato% c para permitir la impresión de caracteres especiales como nuevas líneas, que de lo contrario no podrían incrustarse en la cadena de salida .

No entendí cómo funciona el programa. He mencionado las líneas sobre las que necesito una explicación, cómo funcionan y qué están haciendo. Por favor explique.

+0

que he visto este le preguntó varias veces últimamente. ¿Es esto un desafío de tarea o programador? –

+0

Nada como esto, acabo de encontrarlo. Si fuera una tarea, habría usado la etiqueta de tarea. – SpeedBirdNine

+0

sus comentarios rompen el quine :) también, el sangrado no es correcto en el quine. [este es mi quine más reciente en C++] (http://codepad.org/sKvDs2Et) @MichaelDorgan: sí, es un desafío de programador arraigado históricamente – sehe

Respuesta

6
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"; 

Hay un nombre de puntero de char "programa" que se utiliza para almacenar la cadena y% c y% s son especificadores de formato para char y argumentos de cadena, respectivamente.

printf(program, 10, 34, program, 34, 10, 10, 10, 10, 10, 10); 

función printf es la impresión de salida a la consola, 10 aquí es el código ASCII para la nueva línea y 34 para " parámetros printf están haciendo programa

  • , pasando cadena a imprimir
  • 10, pasando 10 Código ASCII para el primer% c (se convertirá en nueva línea de caracteres)
  • programa, pasando la misma cadena nuevamente a% s en el programa para imprimir la misma cadena nuevamente
  • 34, pasando código 34 ASCII para segunda% c (se convertirá en carácter qoutes dobles)
  • 10, pasando código 10 ASCII para tercera% c (se convertirán a nueva línea de caracteres)
  • 10, pasando código 10 ASCII para 4% c (se convertirá a carácter nueva línea)
  • 10, pasando 10 código ASCII para 5th% c (se convertirá a carácter nueva línea)
  • 10, pasando 10 código ASCII para 6th% c (se convertirá para caracterizar la línea nueva)
  • 10, pasando 10 código ASCII para el 7%% c (se convertirá en el carácter nueva línea)
  • 10 , Pasando código 10 ASCII para el 8% c (se convertirá en nueva línea de caracteres)
+1

Has olvidado uno 34. :-) –

2

Printf imprime la cadena dada como primer argumento (en este caso la cadena en *program) la sustitución de los otros argumentos donde se tiene un% s o% c

% s significa que el argumento es una cadena,% c es un personaje.

Como dice la nota, se utiliza% s para imprimir una copia de la cadena del programa dentro de la cadena de programa - por lo tanto, hacer una copia, y utiliza el% c para imprimir los caracteres 10 (nueva línea) y 34 "

0

Para una mejor comprensión, la variable program podría haber sido escrita así:

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

La idea es que, ejecuta el programa, compila su salida, ejecuta ese programa y así sucesivamente. Pero esto solo se puede hacer con% c valores 10 para avance de línea y 34 para comillas dobles.

-1

Esto se puede hacer mediante el manejo de archivos. Guarde el programa con cualquier nombre y ponga ese nombre en el directorio abierto en el comando fopen. Me gusta el nombre de mi programa es hello.cpp.

Este es el siguiente programa

#include <stdio.h> 
#include <iostream> 
int main() 
{ 
    FILE *fp; 
    fp=fopen("hello.cpp","r"); 
    char ch; 
    while((ch=fgetc(fp))!=EOF) 
    { 
     printf("%c",ch); 
    } 
} 
Cuestiones relacionadas