2016-06-03 1 views
0


어떻게하면 C 프로그램의 기능을 가져 오기 위해 파이썬 스크립트 출력을 전달할 수 있습니까? 내 C 프로그램 코드는 다음과 같습니다 :인라인 파이썬 코드에서 "gets"C 언어 함수 입력 매개 변수

$./a.out "$(python -c 'print "A"*1000')" 

고마워 :

#include <stdio.h> 
int main() 
{ 
    char name[64]; 
    printf("%p\n", name); 
    fflush(stdout); 
    puts("What's your name?"); 
    fflush(stdout); 
    gets(name); 
    printf("Hello, %s!\n", name); 
    return 0; 
} 

는 내가하고 싶은 다음과 같은 것입니다.

+0

먼저 주에게 인수를 전달하는 방법을 살펴 보았습니다. –

답변

4

처럼 실행

python -c 'print "A"*1000' | ./a.out 

내가 가정 여기 버퍼 오버런은 고의적 인 것이므로 안전하지 않은 것에 대한 강의는 생략합니다. gets.

일반적으로 명령 줄 유틸리티는 인수 배열 (의 매개 변수에 argv)에서 해당 입력을 가져 오며, 일반적으로 데이터를 복사 할 필요가 없으므로 버퍼 오버런이 발생할 수 있습니다.

+0

고마워요. 네, 의도적으로 코드에 버퍼 오버런을 두었습니다. –

0
python -c 'print "A"*1000' 

A000 번을 인쇄합니다. 이것을 C 프로그램에 전달하고자한다면, 적어도 하나의 크기가 1000보다 큰 버퍼가 필요하며, 여분의 1은 널 문자를 수용하는 것입니다.

#include <stdio.h> 
#include <string.h> // for strcpy 
int main(int agrc, char* argv[]) 
// int argc- is for number of arguments 
// char* argv[] - argument strings separated by spaced 
// each argument can be accessed by argv[1],argv[2] & so on 
{ 
    char name[1001]=""; 
    // initialize name to null & 1001 for the reason mentioned above 
    printf("%s\n", name); 
    // %p specifier is for the pointer,i used %s here for the string 
    fflush(stdout); 
    /* 
    * This part of your code is useless if you wish 
    * to store the name from the argument. 
    puts("What's your name?"); 
    fflush(stdout); 
    gets(name); 
    */ 
    strcpy(name,argv[1]); // copying the cmd line argument to name. 
    printf("Hello, %s!\n", name); 
    return 0; 
} 

이제, 당신이 "파이프"를 필요로 다른 명령의 표준 입력으로 한 명령의 표준 출력에서 ​​데이터를 전송하는

$./a.out "$(python -c 'print "A"*1000')" 
+1

이것이 사용자가 찾고있는 것인지 확실하지 않습니다. 그렇다면 원래 코드 (당신이 코멘트 한)에서'gets (name);'의 목적은 무엇입니까? –

+0

@mona_sax :이 점에 관해 op의 추가 정보없이 확인할 수는 없습니다 – sjsam

+0

수식에 인수를 복사 할 때의 요점은 무엇입니까? – rici