2016-09-24 4 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に渡しますか? –

関連する問題