2017-01-13 8 views
-1

私は次のようなCコードを使用してユーザーにコマンドを渡すよう要求しています(UNIXで有効です)。そして、その文字列を配列に分割して実行する必要があります。ユーザがexecvp()で与えたコマンド。これはコンパイルされますが、execvpは動作しません。ユーザーの入力を配列に分割する方法に何か問題がありますか? PS:インクルードの一部は必要ではありませんが、最終的なプログラムではありません。ユーザーの入力を受け取り、execvpを実行する

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/wait.h> 
#include <sys/types.h> 
#include <signal.h> 

main() { 

    char str[64]; 
    int i =0; 
    char *p = strtok(str," "); 

    printf("Please give me a Unix command! :\n"); 
    gets(str); 
    char *array[sizeof(str)]; 
    while (p!=NULL) { 
    array[i++] = p; 
    p = strtok (NULL, " "); 
    } 

execvp(str ,array); 
perror("execvp"); 
} 

私はこれを実行したときに私が得る出力は次のようになります。

Please give me a Unix command! : 
ls -l 
execvp: No such file or directory 
+0

を(http://stackoverflow.com/q/1694036/2173917)[ '()'、それは危険ですます使用しないでください]。代わりに['fgets()'](https://linux.die.net/man/3/fgets)を使用してください。 –

答えて

1

strに情報がある前にstrtok(str, " ")に電話しています。あなたが入力を取得した後

単にそれを呼び出す:

main() { 
    char str[64]; 
    char *array[sizeof(str)]; 
    char *p = NULL; 
    int i = 0; 

    printf("Please give me a Unix command! :\n"); 
    fgets(str, sizeof(str), stdin); // Use fgets instead of gets. 

    p = strtok(str," "); 

    while (p != NULL) { 
    array[i++] = p; 
    p = strtok(NULL, " "); 
    } 

    execvp(str, array); 
} 
0

あなたは不定値を読み取るしようとしているように私はここに見るように、最初の問題が

char *p = strtok(str," "); 

です。 strが初期化されていない場合、ヌルターミネーターが存在することを保証するものではありません。の文字列になります。したがって、あなたは本質的にundefined behaviorを呼び出しています。

  • gets(), it is dangerous as it lead to buffer overflow、言っ

    。代わりにfgets()を使用してください。

  • 配列変数の場合、sizeof(str)のサイズは ではありません。配列全体のサイズが返されます。 文字列の長さを取得するのにstrlen()を使用することもできますが、strlen()はヌルターミネータをカウントしないことに注意してください。
関連する問題