0

私は現在、CプログラムにユーザーからのUnix引数を読み取らせようとしています。私はこれまでこのサイトを検索しましたが、私が間違っていることを正確に理解することはできませんでした-確かに私のポインター実装スキルはかなり限られています。

以下は私が今どのようにコードを持っているかです。私は運が悪かったのでポインタをいじり回してきました。エラーは、const * charを使用する必要があることも示していますが、他の例では、ユーザーが*charを入力できることを確認しました。

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

main()
{
    char args[128];
    //User input
    printf("> ");
    fgets(args, 128, stdin);
    execvp(args[0], *args[0]);
}

私が得るエラーは次のとおりです。

smallshellfile.c: In function ‘main’:
smallshellfile.c:13:21: error: invalid type argument of unary ‘*’ (have ‘int’)
smallshellfile.c:13:5: warning: passing argument 1 of ‘execvp’ makes pointer from integer without a cast [enabled by default]
/usr/include/unistd.h:575:12: note: expected ‘const char *’ but argument is of type ‘char’

誰かが問題が何であるか知っていますか?

4

2 に答える 2

2

あなたにはいくつかの問題があります:

  1. *args[0]無意味です。args配列です。args[0]charです。何*args[0]ですか?

  2. char*2番目の引数として渡すには、のNULLで終了する配列を作成する必要があります。

  3. args[0]の最初の文字ですargsargs最初の文字だけでなく、文字列全体(ちょうど)を渡す必要があります。

次のようなものを試してください:

char *argv[]={args,NULL};
execvp(args,argv);
于 2012-02-14T00:11:26.523 に答える
0

これはあなたにとってよりうまくいくかもしれません:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    char args[128];
    char *argv[] = { "sh", "-c", args, 0 };
    printf("> ");
    if (fgets(args, 128, stdin) != 0)
    {
        execvp(argv[0], argv);
        fprintf(stderr, "Failed to exec shell on %s", args);
        return 1;
    }
    return 0;
}

必要最小限のヘッダーがあります。正しく宣言されていますmain()-C99には明示的なリターンタイプが必要です。ユーザーが入力した情報に対してシェルを実行します。ユーザーがリターンキーを押す前に126文字を超えて入力しない限り、エラーメッセージは改行で正しく終了します。execvp()またはいずれかのexec*()関数が返される場合、失敗しました。そのステータスをテストする必要はありません。

私はシェルに実際の仕事をさせることによって驚異的に不正行為をしています。ただし、ユーザーが入力した内容を単語に分割して、コマンドが最初になり、複数の引数が存在するようにすることができます。次に、より大きな配列を割り当てargv、文字列を解析し、それぞれの個別の引数をの独自のエントリに入れてから、beginsをargv使用するのが理にかなっています。execvp()実行するI/Oリダイレクトがある場合、それを実行する必要があるのはシェルであることに注意してください(実際のシェルを実行して実行しない限り、私が行ったように)。

于 2012-02-14T00:26:32.493 に答える