2016-09-24 5 views
0

을 execvp는하기 위해 사용자의 입력 배열을 전달 할 수 없습니다 :이 내 입력 기능입니다

int i,j,n,len,c; 
    char *buffer = 0; 
    size_t bufsize = 0; 
    ssize_t characters; 

    characters = getline(&buffer, &bufsize, stdin); 

    len = strlen(buffer); 
    buffer[len-1]='\0'; 

    if (characters > 0) 
    { 
     char *end_str1; 
     char *token1 = strtok_r(buffer, ";", &end_str1); 
     int count = 0, wordcnt; 
     while (token1 != NULL) 
     { 
      char cmd[10][101]; 
      memset(cmd,0,sizeof(cmd)); 
      wordcnt = 0; 
      char *end_str2; 
      count++; 
      char *token2 = strtok_r(token1, " ", &end_str2); 
      while (token2 != NULL) 
      { 
       n = strlen(token2); 
       strncpy(cmd[wordcnt],token2,n); 
       wordcnt++; 
       token2 = strtok_r(NULL, " ", &end_str2); 
      } 
      cmd[wordcnt+1][0]='\0'; 
      execvp(cmd[0],cmd); 
      token1 = strtok_r(NULL, ";", &end_str1); 
     } 
    } 
    free(buffer); 

유일한 경고 호환되지 않는 포인터 타입이지만, 내 cmd를 어레이는 ** PTR, 그래서 무엇을 이해하지 못하는 잘못된 것입니다.

나는 이것을 ** k와 동일시하고, 그것을 execvp에 전달하려고 시도했다. 일하지 않았어. 나는 cmd를 ** cmd로 바꾸려고 시도했다. 나는 그곳에서 뭔가 잘못했다고 생각했다.

+0

무엇을 버퍼로 전달합니까? – Cyclotron3x3

+0

내가 프로그램에 입력하는 명령은'cd ..; pwd '는 버퍼에 저장됩니다. –

답변

1

cmd 배열 아니,없는 [char] **ptr

입니다.

char[10][100]이고 execvp()으로 전달되면 첫 번째 요소 인 char(*)[101]에 대한 포인터로 사라집니다.

cmd[wordcnt+1][0]='\0'; 

wordcnt 이미 tokenising 루프 내에서 증가했다 :

은 또한 당신은 여기에 "오프 별 하나"오류가 있습니다.

은 당신이 원하는 것은 :

#define MAX_NO_OF_CMD_ELEMENTS (10) 

... 

     char * cmd[MAX_NO_OF_CMD_ELEMENTS + 1]; /* 1+ for the NULL-terminator */ 
     size_t wordcnt = 0; 
     char *end_str2; 
     count++; 
     token2 = strtok_r(token1, " ", &end_str2); 
     while ((NULL != token2) 
       && (MAX_NO_OF_CMD_ELEMENTS > wordcnt)) /* Prevent writing 
                 out of `cmd`'s bounds. */ 
     { 
      cmd[wordcnt] = token2; 
      wordcnt++; 
      token2 = strtok_r(NULL, " ", &end_str2) 
     } 
     cmd[wordcnt] = NULL; 

     execvp(cmd[0], cmd); 

또한^2 getline()0 이미 char -array (는 "문자열")로 끝나는 반환합니다. 이 필요 없음

len = strlen(buffer); 
    buffer[len-1]='\0'; 
+0

'token2 = strtok_r (NULL, "", & end_str2);을하는 것은 어떨까요? while 루프에 포함되어 있습니까? –

+0

이 루프를 입력에 사용하면 프로그램은 배열의 모든 위치에 첫 단어 만 읽습니다. 내가 실수 한거야? http://ideone.com/fRxv5z (관련 코드 말미) –

+0

예제를 수정했습니다. Sry. – alk

0

왜냐하면 잘못된 매개 변수를 함수 execvp에 전달했기 때문입니다.

extern int execvp (const char *__file, char *const __argv[]) 

당신은 따라서 호환되지 않는 오류를 던지고 char *, const*을 기대하고있다 char 형 (*) [101]의 인수를 전달하는 :

execvp(cmd[0],cmd); //this line 

그 선언은 다음과 같다.

+0

어떻게 고칠 수 있습니까? ** cmd 배열을 만들고 malloc을 만들고 그것에 쓰고 exec에 전달해야합니까 ?? –

관련 문제