0

私はポインターが得意ではないので、私が間違っていることがわかるかもしれません。

次のように初期化された配列があるとしましょう。

char *arrayOfCommands[]={"ls -l", "wc -l"};

私の目標は、この配列からchar * currentCommand という配列を取得することです。この配列は、arrayOfCommands の特定のセルを見て、コマンドをスペースで分割します。

私の最終的な目標は、各ループに次のような新しい currentCommand 配列を作成することです。

First Loop:  
currentCommand = [ls][-l]

First Loop:  
currentCommand = [wc][-l]

これが私がこれまでに持っているコードです:

for (i = 0; i < 2; ++i) {
    char str[] = arrayOfCommands[i];
    char * currentCommand;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    currentCommand = strtok (str, " ");
    while (currentCommand != NULL){
        printf ("%s\n",currentCommand);
        currentCommand = strtok (NULL, " ");
    }

    .
    .
    .

    //Use the currentCommand array (and be done with it)
    //Return to top
}

どんな助けでも大歓迎です!:)

アップデート:

for (i = 0; i < commands; ++i) {
    char str[2];
    strncpy(str, arrayOfCommands[i], 2);
    char *currentCommand[10];
    printf ("Splitting string \"%s\" into tokens:\n",str);
    currentCommand = strtok (str, DELIM);
    while (currentCommand != NULL){
        printf ("%s\n",currentCommand);
        currentCommand = strtok (NULL, DELIM);
    }
}

次のエラーが表示されます: ** 割り当てに互換性のない型があります**
strtok 関数を渡している "str" について話しています。

4

1 に答える 1

2

strtok渡す文字列を変更することで動作します。一部のマニュアルページを使用している場合、これは見落としがちです。配列内の各コマンドはリテラル文字列です。それらを変更しようとすると問題が発生します。そのため、で使用する前に、各コマンドのコピーを作成する必要がありますstrtok

さらに、これは配列の無効な初期化です。

char str[] = arrayOfCommands[i];

str固定サイズの配列として宣言し、次を使用strncpyしてトークン化する前に各コマンドのコピーを作成するために使用しstrtokます。

char str[MAX_COMMAND_LEN + 1];
strncpy(str, arrayOfCommands[i], MAX_COMMAND_LEN);

// ...
于 2012-10-01T01:33:34.417 に答える