2013-09-04 3 views
-2

이 짧은 코드에서이 런타임 세그먼트 화 오류를 시도하는 데 문제가 있습니다. 나는 그것이 코드에서 system()과 strcpy()를 사용하는 것과 관련이 있다고 의심하지만,이 오류 유형에 대해 경험하지 못했기 때문에 나는 무엇을해야할지 확신이 없으며 지금까지 많은 유용한 페이지를 발견하지 못했다.strcpy() (의심되는)로 인한 세그먼트 결함 (코어 덤프) 오류

코드 :

#include <stdio.h> 
#include <string.h> 
int main(){ 
     char command[31], string[128]; 
     strcpy(string, (char *)system("grep -Po '(?<=testString\\s)\\S+' File")); 
     string[strlen(string)] = '\0'; 
     printf("%s", string); 
     return 0; 
} 

내가 프로그램을 컴파일하기 위해 GCC 4.7.3를 사용하고 있습니다. 나는이 일에 많은 도움을 주시면 감사하겠습니다.

+3

당신의'int' 반환 값을 캐스팅하고 ['system'] (http://linux.die.net/man/3/system)를에 : 여기

코드입니다 문자열 ... 좋은 일이 올 수 없습니다. –

+0

system''의 귀하의 사용이 잘못, 당신은 사용할 수 있습니다 [는 popen (3)] (http://man7.org/linux/man-pages/man3/popen.3.html) –

+0

시스템을 사용하거나 다른 API cal을 사용하는 경우 해당 호출과 관련된 설명서를 읽고 받아 들여지고 반환되는 내용을 확인해야합니다. 'system'은 당신이 실행중인 명령의 출력을 반환하지 않습니다. 리턴 Z 드만 제공합니다. 출력을 캡쳐하려면,'system' 호출을 호출 후에 열거 나 읽는 파일로 출력 시키거나 파이프 ('popen' 등)를 사용할 수 있습니다. – lurker

답변

0

system 명령은 오류가 발생하면 -1을 반환하고 그렇지 않으면 명령의 반환 상태를 반환합니다.

이 주조 유형은 integer return value입니다.이 경우 segmentation fault이 발생합니다.

명령의 출력을 버퍼에 복사하려면 popen을 사용하여 명령 출력을 읽을 수있는 파일 포인터 FILE *을 반환 할 수 있습니다.

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


int main(int argc, char *argv[]) 
{ 

    FILE *fp; 
    char string[128]; 


    /* Open the command for reading. */ 
    fp = popen("grep -Po '(?<=testString\\s)\\S+' File ", "r"); 

    if (fp == NULL) { 
     printf("Failed to run command\n"); 
     exit; 
    } 

    /* Read the output of command */ 
    while (fgets(string, sizeof(string)-1, fp) != NULL) { 
     printf("%s", string); 
    } 

    /* Close */ 
    pclose(fp); 

    return 0; 
} 
2

systemchar *이 아니라 int을 반환합니다. 문자열로 반환 값을 사용하면 - char * - 대부분 segfault를 제공합니다.

int 시스템 (const char * 명령);

반환 값 오류시 반환되는 값은 -1 (예 : fork (2) 실패)이고 그렇지 않은 경우 은 명령의 상태를 반환합니다. 후자의 반환 상태는 wait (2)에 지정된 형식의 입니다. 따라서 명령 의 종료 코드는 WEXITSTATUS (상태)입니다./bin/sh를 실행할 수없는 경우 종료 상태는 종료 (127) 명령의 종료 상태가됩니다.

+0

매우 빠른 답변 주셔서 감사합니다! 고마워요. @mbratch, 확실히 살펴 보겠습니다. :) – jkrix