2011-02-05 3 views
1

내 프로그램에서 사용자 입력을 받아서 2 차원 char 배열로 파싱 중입니다. 배열로 선언 :execvp()를 사용하여 기본 셸 빌드하기

char parsedText[10][255] = {{""},{""},{""},{""},{""}, 
      {""},{""},{""},{""},{""}}; 

나는 사용자 입력을 잡아는 fgets를 사용하고 sscanf를 함께 분석하고있다. 이것은 내가 생각하는대로 모두 작동합니다.

execvp에 parsedText를 전달하려면 parsedText [0]에 경로가 있어야하고 인수가 제공되면 parsedText [1]에서 parsedText [10]에 있어야합니다.

execvp (parsedText [0], parsedText [1])의 문제점은 무엇입니까?

아마도 언급 할 가치가있는 한 가지는 아마도 "ls"와 같은 명령을 아무런 인수없이 제공하면 잘 작동하는 것입니다.

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include "308shell.h" 

int main(int argc, char *argv[]) 
{ 
char prompt[40] = "308sh"; 
char text[40] = ""; 
char parsedText[10][40] = {{""},{""},{""},{""},{""}, 
          {""},{""},{""},{""},{""}}; 

// Check for arguments to change the prompt. 
if(argc >= 3){ 
    if(!(strcmp(argv[1], "-p"))){ 
     strcpy(prompt, argv[2]); 
    } 
} 

strcat(prompt, "> "); 

while(1){ 
    // Display the prompt. 
    fputs(prompt, stdout); 
    fflush(stdout); 

    // Grab user input and parse it into parsedText. 
    mygetline(text, sizeof text); 
    parseInput(text, parsedText); 

    // Check if the user wants to exit. 
    if(!(strcmp(parsedText[0], "exit"))){ 
     break; 
    } 
    execvp(parsedText[0], parsedText[1]); 
    printf("%s\n%s\n", parsedText[0], parsedText[1]); 
} 

return 0; 
} 

char *mygetline(char *line, int size) 
{ 
if (fgets(line, size, stdin)) 
{ 
    char *newline = strchr(line, '\n'); /* check for trailing '\n' */ 
    if (newline) 
    { 
     *newline = '\0'; /* overwrite the '\n' with a terminating null */ 
    } 
} 

return line; 
} 

char *parseInput(char *text, char parsedText[][40]){ 
char *ptr = text; 
char field [ 40 ]; 
int n; 
int count = 0; 

while (*ptr != '\0') { 
    int items_read = sscanf(ptr, "%s%n", field, &n); 
    strcpy(parsedText[count++], field); 
    field[0]='\0'; 
    if (items_read == 1) 
     ptr += n; /* advance the pointer by the number of characters read  */ 
    if (*ptr != ' ') { 
     strcpy(parsedText[count], field); 
     break; /* didn't find an expected delimiter, done? */ 
    } 
    ++ptr; /* skip the delimiter */ 
} 

} 

답변

2

execvp 포인터 (char **)에 대한 포인터를 얻어, 배열되지 포인터 :

여기에 내 코드이다. 이 포인터는 널 포인터로 끝나는 char * 포인터 배열의 첫 번째 요소에 대한 포인터입니다.

편집 : 여기 execvp에 적합한 포인터의 배열을 하나 (매우 좋지 않다) 방법이있다 : 당신의 인수는 아마 명령 줄 문자열 사용자로부터 온 현실 세계에서 물론

char argbuf[10][256] = {{0}}; 
char *args[10] = { argbuf[0], argbuf[1], argbuf[2], /* ... */ }; 

그들은 아마도 적어도 하나의 문자 (예 : 공백)를 가지므로 더 나은 방법은 원래의 문자열을 그대로 수정하거나 사본을 만든 다음 복제본을 수정하고 null 종결자를 추가하는 것입니다 각 인수 다음에 문자열로 오른쪽 오프셋을 가리 키도록 args[i]을 설정합니다.

대신 모든 동적 할당 (malloc)을 수행 할 수 있지만 가능한 모든 실패 지점을 처리하는 코드를 작성해야합니다. :-)

+0

나는 아직도 조금 혼란 스럽다 (char **). 정확히 어떻게 이러한 char 배열을 올바르게 정의하려고합니까? 또한 숙제이기 때문에 간단한 예제만으로도 충분합니다. 내 숙제를 끄지 않으려 고. – tgai

관련 문제