2016-11-08 20 views
-1

特定のユーザー入力のパス名を取得しようとしています。例えば、ユーザがls | wc私は2つの文字列を最初に1つを(ls)、2つ目を1つ(wc)にしてパス名をつけたいと思っています。私はこれをCプログラムの中でやっています。私のコードは次のようになります。システムコールを使用してCで "which"コマンドを実行する

/*This is a basic example of what i'm trying to do*/ 

char* temp; 
printf("Enter a command\n"); 
/* assume user enters ls */ 
scanf("%s", temp);   
char* path = system(which temp); 
printf("Testing proper output: %s\n", path); 

/*I should be seeing "/bin/ls" but the system call doesn't work properly*/ 

誰かが正しい方向に向いていますか?

+2

'のscanf( "%sの"、TEMP):ここで

は、例えば、(未テスト)です。 –

+2

あなたは 'popen'を' system'ではなくしたいです。また、コンパイラに対して警告を有効にし、それらをエラーとして扱いたいとします。 gccを使用している場合は、 'gcc -Wall -Wextra -Werror'を試してください。 –

+0

popenはパイプを作成してプロセスを開きます。それは私にパス名を与えるか、私は何かが欠けているように見えない?私はパスを見ようとするだけのコマンドを実行しようとしていません。 –

答えて

3

初期化されていないポインタを使用しています。しかし、たとえそれを正しく初期化したとしても、system()は実行するコマンドの出力を返さないため、動作しません。 これを行うにはpopen()を使います。 `temp`はあまりにも初期化されていないので、それは両方のカウントに無効なポインタですされています;`メモリが割り当てられていないい

if (fgets(cmd, sizeof cmd, stdin)) { 
    char cmd[512]; 
    cmd[strcspn(cmd, "\n")] = 0; // in case there's a trailing newline 
    char which_cmd[1024]; 
    snprintf(which_cmd, sizeof which_cmd, "which %s", cmd); 
    char out[1024]; 
    FILE *fp = popen(which_cmd); 
    if (fp && fgets(out, sizeof out, fp)) { 
     printf("output: %s\n", out); 
    } 
} 
+0

ありがとうございます! –

+0

'snprintf(which_cmd、sizeof(which_cmd)、"%s "、cmd);'私は – infixed

+0

@infixedありがとうと思います。今修正されました。 –

関連する問題