1

私はCに不慣れで、自分がやりたいことが可能かどうかさえわからないため、少し問題があります。

argsという配列を関数に渡しています。関数内で、 arrayOfArgsという2D配列も作成しています。私がやりたいのは、argsからの特定の値をarrayOfArgsと呼ばれる2D配列の特定の場所に配置することです。

これはこれまでの私のコードです:

int do_command(char **args){
        //this is usually a changing variable depending on the situation, but I've hard coded it to make sense
        int commands = 3;
        char **arrayOfArgs[commands][10];
        //counts which column in arrayOfArgs we are on
        int commandNum = 0;

//Counts which part of a command we are on
        int count = 0;

    //Array Counters
    int i = 0;
    int j;

    //Go through args until we reach the end
    while (args[i] != NULL){
        if(!strcmp(args[i], "|")){
            arrayOfArgs[commandNum][count] = args[i];
            count++;
        }
        else if (strcmp(args[i], "|")) {
            count = 0;
            commandNum++;
        }
        //Looking at the next value in args
        i++;
    }

arrayOfArgsに入れられるのはぎこちないだけなので、問題が発生しています。配列が指している方法、arrayOfArgsが作成された方法、またはその両方で何か問題が発生したと確信しています。

または、私が試しているように1Dから2Dアレイに移行することも可能ですか?

以前にこのループを呼び出して機能するので、そこにNULLがあると確信しています。

for(i = 0; args[i] != NULL; i++) {
    printf("Argument %d: %s\n", i, args[i]);
}

ありがとう!

4

4 に答える 4

1

まず、内容arrayOfArgsがぎこちないことをどのように確認していますか?内容を印刷していprintfますか?デバッガーを使用していますか?

第二に、保存することになっているの各要素は何ですか?arrayOfArgs9文字以下の文字列の3要素配列であると想定されていますか?それはへのポインタの3x10要素配列であると想定されていcharますか?ポインタへのポインタの3x10要素配列であると想定されていますcharか?

行で

 arrayOfArgs[commandNum][count] = args[i];

式のargs[i]タイプはchar *; これは、の各要素がarrayOfArgsを格納することを意図していることを強く意味しますchar *。その場合、の宣言をに変更arrayOfArgsします

char *arrayOfArgs[commands][10];

(各コマンドは最大9つの引数を持つことができるので、これを読みました)。

IOW、あなたは次のようなものを保存しようとしているようです

    col 0 1 2 3 4 5 6 7 8 9
行
  0 "cmd" "a1" "a2" NULL NULLNULL..。
  1 "cmd" "a1" NULL
..。

2D配列の各文字列へのポインタを格納することによって。

その場合は、arrayOfArgs上記のようにの宣言を変更する必要があります。そうでないarrayOfArgs場合は、どのように見えるかについての例を示す必要があります。

于 2012-09-24T22:10:22.967 に答える
0

問題はここにあります:

char **arrayOfArgs[commands][10];

これは、double charポインターの2次元配列を宣言しますが、これは必要なものではありません。

代わりに次を試してください。

char *arrayOfArgs[commands][10];

編集:char*コードを調べた後、OPが文字配列へのポインタをに割り当てているのを見つけたために変更されましたarrayOfArgs。通知してくれた@wildplasserに感謝します。

于 2012-09-24T22:00:22.953 に答える
0

だから私はいくつかの問題を見ます...

まずchar arrayOfArgs[commands][10];、10文字の文字列の2D配列が必要な場合(これが必要なものだと思います)...そうでない場合は、文字列ポインタの配列の2D配列になります(文字の4D配列のように) :P)

|次に、作成したコードは、引数自体が次の場合にのみ、これらの各コマンドバッファに文字をコピーします。|

パイプシンボル間の内容を探している場合は、関数strchrを調べてstrncpyください。これらの関数を使用して、各引数をループします。引数がパイプシンボルの場合、、パイプシンボルを|含む次の引数を見つけ、次の引数をループします。間、次にその間の文字を動的に割り当てられたchar配列にコピーします

また、コメントの中で、コマンド配列は動的になると言っています...プログラムを構造化する方法で、データはスタックに静的に割り当てられます。これを動的にするには、ヒープに動的に割り当てる必要がありますmalloccalloc

于 2012-09-24T22:11:29.533 に答える
0

私はそれを考え出した。2Dの方法ではなく、1Dのアレイルートを使用することにしました。コードは、以前は「ls」「-l」「|」として分割されていた引数を受け取るようになりました。「wc」であり、「arrayOfCommands」と呼ばれる新しい配列へのパイプがあるかどうかに基づいてそれらを分離します。arrayOfCommandsの内容は、これが完了すると、「ls-l」と「wc」になります。コードは次のとおりです。

int do_command(char **args,) {
    const int commands = 2;
    int i = 0;

    int commandNum = 0;
    int firstCommand = 1;

    char *arrayOfCommands[commands];

    //Go through args until we reach the end
    while (args[i] != NULL){
        //First case            
        if(firstCommand){
            arrayOfCommands[commandNum] = args[i];
            firstCommand = 0;
        }
        //Rest of the cases
        else{
            //if we find something that's not a pipe...
            if(strcmp(args[i], "|")){
                //Add a space to what was a previous part of the same command
                arrayOfCommands[commandNum] = strcat(arrayOfCommands[commandNum]," ");
                arrayOfCommands[commandNum] = strcat(arrayOfCommands[commandNum],args[i]);
            }
            //But if we do find a pipe...
            else if (!strcmp(args[i], "|")) {
                //We know it's time for a new command
                commandNum++;
                firstCommand = 1;
            }               
        }
        //Looking at the next value in args
        i++;
    }

    for(i = 0; i < commands; i++)
        printf("Command #[%d]: %s\n", i, arrayOfCommands[i]);
}
于 2012-09-26T21:57:23.070 に答える