2012-01-16 4 views
3

제 코드를 도와주세요. 나는 c에서 system() 함수를 사용하고있다. C 코드를 사용하여 새 디렉토리를 만들고 싶다고 가정 해 봅시다. 그런 다음 system()를 사용system()에서 변수를 사용하는 방법

char name[]; 

printf("Enter the name of directory: "); 
scanf("%s", &name); 

, 내가 대신 사용하거나 새로운 디렉토리 ryan하게 system("mkdir ryan"); 같은 고정 된 값을 넣는 변수 name[] 를 사용하려면; 내가 원하는 것은 디렉터리 이름을 만들고 변수 name[]에 저장하고 그 값을 ryan 대신 구현하는 것입니다. 귀하의 답변은 높이 평가됩니다.

+1

'system'가'mkdir'를 호출하는 올바른 방법이 아니다. 전화 할 수있는 완벽한 mkdir 함수가 있습니다. '시스템'을 사용하면 처음부터 도입되어서는 안될 모든 종류의 보안, 견고성 및 성능 문제가 발생합니다. 기본적으로 '시스템'에 대해 들어 본 적이 있다는 것을 잊어 버리십시오. ** 절대 사용해서는 안됩니다 **. –

+2

당신이 그것을 필요로 할 때를 제외하고 :-) – paxdiablo

답변

-3

시도 :

char command[80]; 
strcpy(command, "mkdir "); 
strcat(command, name); 
system(command); 
+2

당신은 const char *를 첫 번째 매개 변수로 strcat를 사용할 수 없습니다. –

+0

@AhmedMasud 경고를 보내 주셔서 감사합니다. 더 나아 졌니? – wrongusername

+1

왜 이렇게 복잡하게 만들지 않는가 snprintf –

0

우선 (그리고 코드는 단지 예입니다 경우이 아마 문제가되지 않습니다), 지금까지 사용하지 않는 안 바운드 %sscanf - 버퍼 오버 플로우까지 당신을 엽니 다.

이 같은 문자열이있는 경우 :

char name[] = "paxdiablo"; 

을 그냥 실행을위한 자신 만의 캐릭터를 구성하는 것을 사용할 수 있습니다.

char cmd[1000]; 
strcpy (cmd, "mkdir "); 
strcat (cmd, name); 
system (cmd); 

그리고 당신은 (충분히 큰 그래서 버퍼를 할당 동적 또는 strlen으로 확인하거나)을 알고 확인 당신이 거기뿐만 아니라 버퍼 오버 플로우와 끝까지하지 않도록하는 것이 name의 크기입니다.

동적 할당 하나의 예 :

void tryMkdir (char *dir) { 
    static char prefix[] = "mkdir "; 
    // Use sizeof to allow for null char at end. 
    char *cmd = malloc (sizeof (prefix) + strlen (dir)); 
    if (cmd != NULL) { 
     strcpy (cmd, prefix); 
     strcat (cmd, dir); 
     system (cmd); 
     free (cmd); 
    } 
} 

(일부 오류가 mkdir 또는 malloc가 실패한 경우에 거기에 확인하려는 아마 거라고하지만).

+0

snprintf에 무슨 문제가 있습니까? –

+0

아무 것도. 이 일을하는 방법은 여러 가지가 있습니다. 간단한 문자열 연결의 경우,'snprintf '의 모든 기능보다는'strcat'을 선호합니다 (버퍼가 충분히 클 수 있기 때문에 여기에서 길이 검사를 할 필요가 없습니다). 두 개 이상으로 구성된 문자열을 구성하거나 길이가 확실하지 않은 경우 아마 전환 할 수 있지만이 경우에는 필요하지 않습니다. – paxdiablo

+0

모두 malloc, 여러 호출 등으로 복잡하게 들린다. 하나의 snprintf가 MAX_PATH 크기의 스택 (매크로의 이식성이 100 %가 아님)에 대한 배열과 관련이있는 경우 정말로 OP는 시스템 호출을 사용해야한다. 디렉토리를 만드십시오. 왜냐하면 시스템 콜을 사용하는 것으로 제한 되었기 때문에, OS –

0

system()에 전달할 전체 명령과 함께 문자열을 작성해야합니다. 즉, 원래 코드에서 이름에 대해 수행하지 않은 공간을 할당해야합니다. scanf를 호출하면 실패 할 수 있습니다.) mkdir 예제와 같이 mkdir로 시작하는 문자열을 만들 수 있습니다. &에는 디렉토리 이름에 충분한 공간이 있습니다. scanf를 호출하면 해당 문자열 내에서 이름을 지정하려는 위치를 가리 키십시오. 나중에 strcat 또는 somesuch 할 필요가 저장하고, 이것이 유일한 이유는 디렉터리 이름이 필요한 경우, 왜 두 번 저장할 수 있습니까? 당신은 같은 것을 사용한다

6

: 여기

char name[100]; 
printf("Enter the name of the directory: "); 
if (scanf("%99s", name) == 1) // Not &name 
{ 
    char command[120]; 
    sprintf("%s %s", "mkdir", name); 
    if (system(command) != 0) 
     ...oops... 
} 
+1

또는 "snprintf"를 사용하여 "충분히 큰"크기에 관계없이 버퍼 오버플로를 방지 할 수 있는지 확인하십시오. –

+2

입력을 100 자 미만으로 제한하고'strlen ("mkdir")'이 20 미만이기 때문에 안전합니다. 다른 상황에서는'snprintf()'가 더 좋을 것입니다. –

+0

아주 좋은 해결책. –

1

는이 구현 될 수있는 방법의 예입니다

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

int main() { 
    char *dirname = NULL; 
    char *cmdline = NULL; 
    size_t len; 
    size_t dirlen = 0; 
    int rv = 0; 

    printf("Enter directory: "); 
    if ((len = getline(&dirname, &dirlen, stdin)) < 0) { 
     perror("getline"); 
     exit(-1); 
    } 

    dirname[len-1] = 0; 
    cmdline = malloc(len+8); 
    snprintf(cmdline, dirlen+8, "mkdir %s", dirname); 
    rv = system(cmdline); 
    free(cmdline); 
    free(dirname); 
    rv = WEXITSTATUS(rv); 
    return rv; 
} 
+1

'dirname'도 해제하는 것을 잊지 마십시오. Linux 및 * BSD에서 사용할 수 있지만 ([getline()]] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getdelim.html)은 POSIX 2008에 포함되어 있습니다. MacOS X), 어디서나 사용할 수있는 것은 아닙니다. –

관련 문제