2011-10-07 5 views
15

this 사이트에 자신을 인쇄하는 프로그램이 나왔습니다. 즉, 프로그램 코드가 인쇄됩니다.자체를 인쇄하는 프로그램은 어떻게 작동합니까?

프로그램 코드는 다음과 같습니다

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

그리고 주어진 설명입니다 : 여기에 내장 %의 지정 문자열을 사용하는

두 개의 키 트릭 문자열을 포함 할 수 있도록은 % c 형식 지정자를 사용하여 특수 문자 을 줄 바꿈과 비슷하게 인쇄 할 수 있습니다.이 경우 줄 바꿈 문자는 문자열에 포함될 수 없습니다.

나는 프로그램이 어떻게 작동 하는지를 몰랐다. 나는 내가 필요한 설명을하고, 어떻게 작동하며, 무엇을하고 있는지에 대해 언급했다. 설명 해주십시오.

+0

다음의 프로그램을 것입니다. 이것이 숙제인가 아니면 프로그래머 도전인가? –

+0

이 같은 것은 없습니다, 나는 그것을 가로 질러 왔습니다. 숙제 인 경우 숙제 태그를 사용했을 것입니다. – SpeedBirdNine

+0

귀하의 의견도 quine :) 휴식, 또한 indenting은 quine에서 올바르지 않습니다. [이것은 최근 C++에서 가장 최근에 나온 것입니다.] (http://codepad.org/sKvDs2Et) @MichaelDorgan : 예 역사적으로 뿌리깊은 프로그래머의 도전입니다. – sehe

답변

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

문자열을 저장하는 데 사용되는 char 포인터 이름 "program"이 있으며 % c 및 % s는 각각 char 및 string 인수에 대한 형식 지정자입니다.

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

printf 함수 콘솔에 출력을 인쇄하고, 10은 여기 전달

  • 10
  • 를 인쇄 할 문자열을 전달

    • 프로그램을하고 ASCII의 개행 코드 " 의 printf 파라미터 34 인 첫 번째 % c의 ASCII 코드 (문자 개행 문자로 변환 됨)
    • 프로그램에서 동일한 문자열을 프로그램에서 % s (으)로 다시 전달하여 동일한 문자열을 다시 인쇄합니다.
    • 34, 두 번째 % c에 34 ASCII 코드 전달 (문자 double qoutes로 변환 됨)
    • 10, 세 번째 % c에 10 ASCII 코드 전달 (문자 개행 문자로 변환 됨)
    • 10 개, ASCII 코드 10 개 (문자 개행 문자로 변환 될 것입니다)
    • 10, 6 번째 % c에 10 개의 ASCII 코드를 전달합니다 (개행 될 문자 수는 개행 문자로 변환됩니다)
    • 10, 5 번째 %
    • 10, 7 번째 % c에 10 개의 ASCII 코드 전달 (문자 개행 문자로 변환 됨)
    • 10 (문자 줄 바꿈으로 변환됩니다) 더 나은 이해를 위해
    +1

    34 개를 잊어 버렸습니다. :-) –

    2

    PRINTF 당신은 %의 s 또는 % C를 다른 인수를 대체 (이 경우 *program의 문자열) 첫 번째 인수로 주어진 문자열을 출력

    %의 S는 아규먼트는 문자열, % C를 의미 문자입니다.

    메모가 적혀

    , 그것은 프로그램의 문자열 내부의 프로그램 문자열의 복사본을 인쇄 할 % s을 (를) 사용 - 따라서 사본을 만들기를하고, 문자 (10) (새로운 라인), 34 "

    를 인쇄 할 %의 C를 사용하여
    0

    8 %의 C를 10 ASCII 코드를 전달 변수 program는 다음과 같이 기록 된 수 :

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

    아이디어는 것을,이다 당신은 프로그램을 실행하고 출력을 컴파일하고 을 실행하여 프로그램을 실행합니다. 그러나 이것은 줄 바꿈에 대한 % c 값 10과 큰 따옴표에 대한 34 값으로 만 수행 할 수 있습니다.

    -1

    파일 처리를 사용하여 수행 할 수 있습니다. 프로그램을 이름으로 저장하고 fopen 명령의 열린 디렉토리에 그 이름을 넣으십시오. 내 프로그램 이름이 hello.cpp와 같습니다.

    내가이 최근에 여러 번 물어 본 적이

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