2014-02-28 2 views
0

명령 인수로 입력 한 파일 위치에서 system()을 사용하여 cat을 호출하는 간단한 프로그램을 작성하려고합니다. 하지만 파일을 호출 할 때마다 분할 오류 (코어 덤프)가 발생합니다. 이유를 확인해 주시겠습니까 (제 프로그램에서 어디에도 보이지 않습니다.이 오류를 얻기 위해 메모리를 가지고 뭔가를하고 있습니다!). 당신의 strcat 통화에서간단한 명령 행 프로그램에서 분할 오류

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

int main(int argc, char *argv[]) 
{ 
    if(argc != 2) 
    { 
     printf("usage: %s filename", argv[0]); 
    } 
    else 
    { 
     printf("commad: %s", strcat("cat ", argv[1])); 
     system(strcat("cat ", argv[1])); 
    } 
    return 0; 
} 
+1

문자열 리터럴을 수정하는 것은 정의되지 않은 동작입니다. – hmjd

+0

설명해 주시겠습니까 – MedAli

+0

@MohamedAliJamaoui strcat에 대한 대상 버퍼를 제공해야합니다 –

답변

3

을 연결하지 않는다, 실행 파일이로드 될 때 일반적으로 메모리에 읽기 전용 세그먼트에 저장되어있는 같은 "cat "로, 당신은하려고 할 때 그것을 수정하면, 당신은 당신이 설명하도록 요구 한 세분화 오류를 얻게 될 것입니다.

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

#include <string> 

int main(int argc, char *argv[]) {  
    if(argc != 2) { 
     printf("usage: %s filename", argv[0]); 
     return 0; 
    } else { 
     std::string command("cat "); 
     command += argv[1]; 
     printf("command: %s", command.c_str()); 
     return system(command.c_str()); 
    } 
} 

std::string 목적은 당신이 그것에 추가 문자를 추가로 수용 할 수 있도록 동적으로 필요한 메모리를 할당합니다 :

하는 대신 std::string 사용을 고려, 그것은 더 관용적 C++ 방법입니다. 그러나 C 문자열을 계속 사용하려면 문자 버퍼를 명시 적으로 관리해야합니다.

char *buffer = static_cast<char*>(malloc(5 + strlen(argv[1]))); 
strcpy(buffer, "cat "); 
strcat(buffer, argv[1]); 
printf("command: %s", buffer); 
// ... 
free(buffer); 
2

당신은 정의되지 않은 동작입니다 문자열 리터럴 "고양이"를 수정하려고합니다. strcat의 첫 번째 인수는 문자열 리터럴이 아닌 쓸 수있는 버퍼 여야합니다.

2

strcat를 잘못 사용하고 있습니다. 대상 버퍼를 제공해야합니다.

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

int main(int argc, char *argv[]) 
{ 
     if(argc == 2) { 
      char[20] c = "cat"; 
      strcat(c, argv[1]); 
      printf("commad: %s", c); 
      system(c); 
     } 
     else { 
      printf("usage: %s filename", argv[0]); 
     } 

     return 0; 
} 

또는 당신은 문자열 리터럴을 수정할 수 없습니다

printf("commad: %s%s", "cat ", argv[1]); 
+0

+1 –