2014-05-24 4 views
0

사용자 argv를 얻고 결과를 화면에 출력하려고합니다. 다음 코드는 다음과 같습니다.C - strcat 관련 문제

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

int main (int argc, char *argv[]) 
{ 
    if (argc >= 1) 
    { 
     char *command = "gcc "; 
     strcat(command, argv[1]); 
     printf("%s", command); 
     return 0; 
    } 
} 

컴파일됩니다.하지만 실행할 때마다 "Windows가 작동하지 않습니다."라는 메시지가 표시됩니다. 기본적으로, 사용자가 않는 경우 :

myprogram.exe test 

출력은

gcc test 

가 어디에 오류가 될 수 있을까요?

답변

3

당신은 즉

char command[50]; 
strcpy(command, "gcc "); 
strcat(command, argv[1]); 
+0

50 대신 5001을 사용했습니다. 감사합니다. –

+0

동적 할당의 다른 답변을 염두에 두십시오. 결국 5001의 배열에 맞지 않는 입력을 얻을 수 있습니다. – Henry

+3

이로 인해 정의되지 않은 동작이 발생합니다. 'strcat'는 기존 문자열에 추가하지만'command'는 초기화되지 않습니다. 'strcpy'로 시작하거나,'command [0]'을 최소한'0'으로 초기화해야합니다. –

1

당신은 strcat와를 사용하기 전에 문자 포인터에 메모리를 할당 할 필요가 모든 것을 보관 유지하는데 충분한 크기로 strcat와 당신의 목적지 인수가 필요합니다. 왜냐하면 char * command = "gcc"는 메모리 위치를 가리키고 있기 때문입니다. 해당 위치에 쓰기 전에 malloc을 사용하여 메모리를 할당하거나 배열로 변경해야합니다.

1
char *command 

은 어떤 공백도 지정하지 않고 배열을 선언합니다. 그것을 사용하기 전에 포인터에 공간을 할당해야하거나 문자 배열을 사용할 수 있습니다.

char command[100]="string"; 

또는

char *command = (char*) malloc (size); 

그리고 당신이 사용했던 것처럼 당신은 strcat와 사용할 수 있습니다.

+1

'char * command;'는 배열이 아니라 포인터를 선언합니다. 또한 OP의 코드는 실제로 일부 공간을 가리 킵니다. 그리고 malloc을 캐스팅하지 마십시오. –

+0

왜 malloc을 캐스트하지 않아야합니까? –

+0

[여기를 참조하십시오 (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). 캐스트에는 0 개의 양호한 효과와 0이 아닌 나쁜 영향이 있습니다. –