2016-03-19 10 views
0

私が受け取った配列をstrtok()を使って関数で引数として分割しようとしていて、単に期待通りに機能しません。 たとえば、私はこの文字列を受け取ります:"ls -l"と私は"ls"を得ました。 さらに、トークンを文字列の配列に格納したいと思います。ここ は、私がこれまでにやっていることです:Strtok()が適切に配列を分割しない

int mysystem(char *s) { 
    int i; 
    char *tok , *aux; 
    int conta = 0; 
    int pid, status; 
    int j = 0; 

    tok = strtok(s , " "); 

    while (tok != NULL) { 
     tok = strtok(NULL, s); 
     conta++; 
    } 

    char *store[conta]; 
    i = 0; 
    aux = strtok(s ," "); 

    while (aux != NULL) { 
     store[i] = aux; 
     aux = strtok(NULL, s); 
     i++; 
    } 

    pid = fork(); 
    if (pid == 0) 
     execvp(store[0], store); 

    while (j != conta) { 
     wait (&status); 
     j++; 
    } 
    return 0; 
} 

は、これは私が私の関数に文字列を渡しているところの主である:

int main(int args, char **arg) { 
    int i; 
    int s; 
    int f = 0; 

    if (args >= 2) { 
     int length = 0; 

     for (i = 1; i < args; ++i) { 
      length += strlen(arg[i]); 
     } 
     char *output = (char*)malloc(length + 1); 
     char *dest = output; 
     i = 1; 

     while (i < args) { 
      dest = strcat (dest,arg[i]); 
      i++; 
      if (i < args) { 
       dest = strcat (dest," "); 
      } 
     }  
     dest = strcat(dest, "\0"); 
     s = mysystem(dest); 
     free(output); 
     return s; 
    } 
} 
+0

'argv [i]'に空白( ''' ')が含まれていると、あなたのプログラムは予期せぬ動作をします。 – alk

+0

"*トークンを文字列の配列に格納したい*"そうして、現在はコードはありません。char * store [conta];は 'char'へのポインタの配列です。 – alk

+0

コードを一貫してインデントする方法を学びます。 – chqrlie

答えて

1

strtokは、文字列を変更しますので、あなたがすることはできません同じ文字列で2回実行します。 sは、NUL文字で区切られた一連の文字列に変換されています。 「十分に長い」配列を使用するように変更し、sを1回だけ実行します。

関連する問題