2016-11-08 2 views
-1

특정 사용자 입력에 대한 경로 이름을 얻으려고합니다. 예를 들어, 사용자가 ls | wc 나는 두 개의 문자열을 첫 번째 문자열 (ls)과 두 번째 문자열 (wc)로 만들고 싶습니다. 그래서 경로 이름을 갖습니다. C 프로그램 내에서이 작업을 수행하고 있으며 코드는 다음과 같습니다.시스템 호출을 사용하여 C에서 "which"명령을 실행하십시오.

/*This is a basic example of what i'm trying to do*/ 

char* temp; 
printf("Enter a command\n"); 
/* assume user enters ls */ 
scanf("%s", temp);   
char* path = system(which temp); 
printf("Testing proper output: %s\n", path); 

/*I should be seeing "/bin/ls" but the system call doesn't work properly*/ 

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

+2

'는 scanf ("% s '에, 온도) :

여기 (안된) 예입니다. –

+2

'popen'은'system'이 아니길 원합니다. 또한 컴파일러에 경고를 설정하고 오류로 처리하려고합니다. gcc를 사용한다면'gcc -Wall -Wextra -Werror'를 시도해보십시오. –

+0

popen은 파이프를 생성하여 프로세스를 엽니 다. 그것은 나에게 경로명을 주거나 뭔가를 놓치고있는 것처럼 보이지 않습니다. 경로를 보려고하는 명령을 실행하려고하지 않습니다. –

답변

3

초기화되지 않은 포인터를 사용하고 있습니다. 그러나 제대로 초기화했다하더라도 system()이 실행하는 명령의 출력을 반환하지 않기 때문에 여전히 작동하지 않습니다. 이렇게하려면 popen()을 사용하고 싶습니다. temp`이 너무 초기화되지 않은됩니다`, 그래서 모두 카운트 잘못된 포인터의`할당 전혀 기억이 없다;

if (fgets(cmd, sizeof cmd, stdin)) { 
    char cmd[512]; 
    cmd[strcspn(cmd, "\n")] = 0; // in case there's a trailing newline 
    char which_cmd[1024]; 
    snprintf(which_cmd, sizeof which_cmd, "which %s", cmd); 
    char out[1024]; 
    FILE *fp = popen(which_cmd); 
    if (fp && fgets(out, sizeof out, fp)) { 
     printf("output: %s\n", out); 
    } 
} 
+0

고마워요! –

+0

'snprintf (which_cmd, sizeof (which_cmd), "% s", cmd);'나는 – infixed

+0

@infixed 감사하다고 생각합니다. 이제 해결되었습니다. –

관련 문제