2013-02-22 4 views
0

그래서 myargv라는 char ** 변수를 만들었습니다. myargv는 각 인덱스에 문자열을 저장하는 배열처럼 작동해야합니다. char **를 myargv에 반환하는 함수를 가지고 있으며 함수는 내부에서 모든 것을 인쇄 할 때 제대로 작동하는 것처럼 보입니다. 그러나 main에서 myargv의 내용을 인쇄하려고하면 더 이상 작동하지 않습니다. .. 누가 도와 줄 수 있니?Char ** 함수가 함수 외부에서 작동하지 않습니다.

char **findArgs(char *line) 
{ 
int i = 0; 
char **temp, *tokTemp; 
char **myargv; 

tokTemp = strtok(line, " "); 

myargv = malloc(sizeof(*myargv)); 

while (tokTemp != NULL) 
{ 
if (strcmp(tokTemp, ">") == 0 || strcmp(tokTemp, "<") == 0 || strcmp(tokTemp, ">>") == 0) 
{ 
    break; 
} 
else 
{ 
    myargv[i] = malloc(strlen(tokTemp) + 1); 
    //myargv[i] = malloc(sizeof(char)*strlen(tokTemp)); 
    strcpy(myargv[i], tokTemp); 
    //printf("myargv[%d] = %s \n", i, myargv[i]); 

    temp = realloc(myargv, (i+2)*sizeof(*myargv));  
    if (temp != NULL) 
    { 
     myargv = temp; 
    } 
    tokTemp = strtok(NULL, " "); 
    i++; 
} 
} 
myargv[i] = NULL; 
//printf("myargv[0] = %s\n", myargv[0]); 
return myargv; 
} 


int main(int argc, char *argv[], char *env[]) 
{ 
int cmdInt, pid, status, i = 0, ioNumber = 0; 
char input[64], lineBUFFER[64], lineBUFFER2[64], lineBUFFER3[64], lineBUFFER4[64], homePath[64], fileName[64], cmdPathFINAL[64]; 
char *cmd; 
char **myargv, **cmdPath; 
int myFile; 

while(1) 
{ 

printf("command: "); 
gets(input); 

strcpy(lineBUFFER, input); 
strcpy(lineBUFFER2, input); 
strcpy(lineBUFFER3, input); 
strcpy(lineBUFFER4, input); 

cmd = strtok(lineBUFFER3, " "); 
cmdInt = findCommand(lineBUFFER2); 

ioNumber = ioCheck(lineBUFFER4, fileName); 
//printf("ioCheck = %d \n", ioNumber); 
//printf("Filename: %s \n", fileName); 

myargv = findArgs(lineBUFFER); 
//printf("myargv[0] = %s\n", myargv[0]); 

findHome(env, homePath); 
//printf("Home path = %s\n", homePath); 

switch(cmdInt) 
     { 
      case 0 : 

      if (myargv[1] == NULL) 
    { 
     chdir(homePath); 
    } 
    else 
    { 
     //printf("1st argument: %s, 2nd argument: %s, 3rd argument: %s \n", myargv[1], myargv[2], myargv[3]); 
     chdir(myargv[1]); 
    } 

       break; 
      case 1 : 

       exit(1); 

       break; 
      default : 

      pid = fork(); 
    if (pid == 0) 
    { 
    //printf("Parent %d waits for child %d to die. \n", getpid(), pid); 
    pid = wait(&status); 
    printf("dead child = %d, how = %04x \n", pid, status); 
    exit(100); 
    } 
    else 
    { 
     ioNumber = ioCheck(lineBUFFER4, fileName); 
      //printf("ioCheck = %d \n", ioNumber); 
      //printf("Filename: %s \n", fileName); 
     cmdPath = getPath2(env); 
      //printf("cmdPath[0] = %s\n", cmdPath[0]); 

      findPath(cmd, cmdPath, cmdPathFINAL); 
      printf("Command Path = %s\n", cmdPathFINAL); 

     if (ioNumber == 1) 
     { 
      close(0); 
      myFile = open(fileName, O_RDONLY); 
     } 
     else if (ioNumber == 2) 
     { 
      close(1); 
      myFile = open(fileName, O_WRONLY|O_CREAT, 0644); 
     } 
     else if (ioNumber == 3) 
     { 
      close(1); 
      myFile = open(fileName, O_WRONLY|O_APPEND); 
     } 

     execve(cmdPathFINAL, myargv, env); 
     //printf("child %d dies by exit() \n", getpid()); 
     exit(100); 
    } 

       break; 
     } 
} 

if (ioNumber == 1 || ioNumber == 2 || ioNumber == 3) 
{ 
close(myFile); 
} 

return 0; 
} 
+0

귀하의 경우에는 '작동하지 않음'을 정의하십시오. – Raptor

+0

myargv [i] = NULL을 추가하십시오. while 루프 이후에. 구문 분석은 최종 포인터가 모호한 값으로 해석되는 것을 제외하고는 저에게 효과적이었습니다. while 루프가 시작될 때 파이프가 있는지 확인할 수도 있습니다. – bvj

+0

글쎄, printf ("myargv [0] = % s, myargv [1] = % s \ n", myargv [0], myargv [1]); 함수 내부에서, 그것은 잘 작동하는 것 같다 ...하지만 내 main에서 함수 밖에서 같은 printf 시도 할 때, "코어 덤프"가져옵니다. –

답변

0

다음은 Window 및 SuSE Linux 10.4 x86_64 커널 2.6.16에서 모두 작동합니다. 파서에는 getArgs 및 getArgs2의 두 가지 버전이 있습니다. 코드에 철저한 검토를하지는 않았지만 잘하면 그것이 도움이 될 것입니다.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 

int getArgs(const char *line, char *args[], int argc) 
{ 
    int len, i = 0; 
    const char* delims = " "; 
    char *ltok = strdup(line); 
    char *tok = strtok(ltok, delims); 

    for (; tok != NULL; i++) { 

     if (strchr("><|", *tok) != NULL) /* not sure why this test is needed for CLI */ 
      break; 

     if (args != NULL && i < argc) { 
      args[i] = strdup(tok); 
     } 

     tok = strtok(NULL, delims); 
    } 

    free(ltok); 

    return i; 
} 

int getArgs2(const char *line, char **args, int argc) 
{ 
    int len, i = 0; 
    const char *p, *q; 
    const char *delims = " "; 

    p = line; 
    while (strchr(delims, *p) != NULL && *p != '\0') 
     p++; 

    q = p; 
    while (strchr(delims, *q) == NULL && *q != '\0') 
     q++; 

    for (; q > p; i++) { 

     if (strchr("><|", *p) != NULL) /* not sure why this test is needed for CLI */ 
      break; 

     len = q-p; 

     if (args != NULL && i < argc) { 
      args[i] = (char *)malloc(len + 1); 
      strncpy(args[i], p, len)[len] = '\0'; 
     } 

     p = q; 
     while (strchr(delims, *p) != NULL && *p != '\0') 
      p++; 

     q = p; 
     while (strchr(delims, *q) == NULL && *q != '\0') 
      q++; 

    } 

    return i; 
} 


int main(int argc, char *argv[]) 
{ 
    char line[256], *q; 
    char **args; 
    int count, n; 

    for(;;) { 

     printf("command: "); 
     if (fgets(line, sizeof(line)/sizeof(line[0]), stdin) == NULL) 
      break; 

     q = line; 
     while (isspace(*q)) 
      q++; 

     if (*q == '\0') 
      break; 

     while (*q != '\0' && *q != '\n' && *q != '\r') 
      q++; 

     *q = '\0'; 

     for(count = 0, q = line; *q != '\0'; q++) 
      if (*q == ' ') 
       count++; 

     printf("Input command: %d character(s), %d space(s) for \"%s\"\n", strlen(line), count, line); 

     count = getArgs(line, NULL, 0); 

     if (count > 0) { 
      args = (char **)malloc(sizeof(char *)*count); 
      count = getArgs(line, args, count); 
     } else { 
      args = NULL; 
     } 

     printf("Parsed %d arg(s) from line\n", count); 
     printf("--------------------------------------\n"); 

     for (n = 0; n < count; n++) { 
      printf("%d: %s\n", n+1, args[n]); 
      free(args[n]); 
     } 

     free(args); 

    } 

    return 0; 

} 
+0

그래서 내 코드에 무슨 문제가 있었습니까? 메모리를 올바르게 할당하지 않았습니까? –

+0

코드를 실행할 수 없어서 시도 할 수있는 대안을 제공했습니다. 나는 그것이 도움이되기를 바랍니다. – bvj