Thursday, September 23, 2004

โปรแกรมที่พิมพ์ตัวเองออกมา: Self-Printing Program

เคยเห็นคุยกันใน Blog ของ Thep เลยลองทำเล่นดูบ้าง เป็นภาษา C
#include <stdio.h>

char a[] = {
  ' ',
  ' ',
  '0',
  ... 
  ... 
  '\n',
  0
};

/* self.c: A sample program which prints out itself.
   Usage:

   $ gcc -o self self.c
   $ ./self > foo.c
   $ diff self.c foo.c
   $
   (you will have foo.c = self.c)
*/

main() {
  int i;
  char c;
  printf ("#include <stdio.h>\n\n");   /* Print header */
  printf ("char a[] = {\n");
  for(i=0;i<sizeof(a)-1;i++) {         /* Print array content */
    c=a[i];
    if(c=='\n')
      printf("  '\\n',\n");
    else if(c=='\\')
      printf("  '\\\\',\n");
    else if(c=='\'')
      printf("  '\\\'',\n");
    else 
      printf("  '%c',\n",c);
  }
  printf("%s",a);                      /* Program body from array */
}
พอดีใส่ comment /*...*/ มากไปหน่อย ตรงท่อน char a[] { ... } เลยต้องทำโปรแกรม Perl ขึ้นมาช่วยสร้างข้อมูล โปรแกรมออกมาค่อนข้างยาวตามไปด้วย
$ wc self.c
 666  888 5156 self.c
$ gcc -o self self.c
$ ./self > foo.c
$ diff self.c foo.c
$ ls -al self.c foo.c
-rw-r--r--    1 vuthi    vuthi        5156 Sep 24 00:15 foo.c
-rw-r--r--    1 vuthi    vuthi        5156 Sep 24 00:01 self.c
ตัวโปรแกรม: self.c

1 comment:

poonlap said...

นับถือๆ (ตั้งแต่ก่อนเจอพี่ฮุ้ยตัวจริง). ถ้าคิดเองจะงงๆแล้วเลิกไป. ขอบคุณครับ.