2013-09-25 7 views
0

"ls"또는 "ls -l"과 같은 간단한 쉘을 만들고 그것을 실행합니다.예상 'char **'하지만 인수는 'char *'유형입니다. --argv

basic_shell.c: In function ‘main’: 
basic_shell.c:42: warning: passing argument 1 of ‘execute’ from incompatible pointer type 
basic_shell.c:8: note: expected ‘char **’ but argument is of type ‘char *’ 

당신이 나에게 제대로 내 실행 함수에 인수를 전달하는 방법에 대한 몇 가지 포인터를 적어주세요 수 :

#include <stdio.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 

void execute(char **argv) 
{ 
    int status; 
    int pid = fork(); 
    if ((pid = fork()) <0) 
    { 
     perror("Can't fork a child process\n"); 
     exit(EXIT_FAILURE); 
    } 
    if (pid==0) 
    { 
    execvp(argv[0],argv); 
     perror("error"); 
    } 
    else 
    { 
     while(wait(&status)!=pid) 
     ; 
    } 


} 

int main (int argc, char **argv) 

{ 

    char args[256]; 
    while (1) 
    { 
     printf("shell>"); 
     fgets(args,256,stdin); 
     if (strcmp(argv[0], "exit")==0) 
      exit(EXIT_FAILURE); 
     execute(args); 
    } 

} 

나는 다음과 같은 오류가 발생하고있다 :

여기 내 코드입니까?

+1

누군가 xkcd 만화를 기억하는 포인터를 물어볼 때마다 ... – streppel

답변

2

바로 지금은 문자열 배열을 필요로하는 execute()에 단일 문자열을 전달하고 있습니다. execute()이 제대로 처리 할 수 ​​있도록 args을 구성 요소 인수로 분해해야합니다. strtok(3)은 아마도 시작하기에 좋은 장소 일 것입니다.

2

note: expected ‘char **’ but argument is of type ‘char *’ 모두를 말합니다.

그 밖의 무엇이 필요합니까?

argschar *에 부패되어 있지만 당신은 strtok 기능

사용하여 args
  • 에 명령
  • 옵션

을 분할해야 char **

void execute(char **argv) 위해 가지고