0

char*** を割り当てたいと思います。私は次のような文を持っています: "これはコマンド && です || ; 分割する必要があります" 各ボックスに次のような完全な文を入れる必要があります:

cmd[0] = "This is a command"
cmd[1] = "wich I"
cmd[2] = "need to"
cmd[3] = "split"

文は のようなトークンで区切られ&&, ||, ;, |ます。
私の問題は、3 次元配列を割り当てる方法がわからないことです。常にセグメンテーション違反が発生します。

これが私がすることです :

for(k = 0; k < 1024; k++)
   for( j = 0; j < 1024; j++)
       cmd[k][j] = malloc(1024);

しかし、数行後、別のループで:

»           cmd[k][l] = array[i];

ここでセグメンテーション違反が発生します。

どうすればこれを行うことができますか? 前もって感謝します

4

2 に答える 2

1

C の 2/3D 配列は と同じではないことに注意してくださいchar ***

1024^3 文字の配列が必要な場合は、

char array[1024][1024][1024];

ただし、これによりスタックに 1 GB のスペースが割り当てられることに注意してください。これは機能する場合と機能しない場合があります。

これをヒープに割り当てるには、正しく入力する必要があります。

char (*array)[1024][1024] = malloc(1024*1024*1024);

このシナリオarrayでは、2D 1024x1024 文字マトリックスの配列へのポインターです。

本当に作業したい場合char ***(配列の長さが静的である場合はお勧めしません)、すべての中間配列も割り当てる必要があります。

char *** cmd = malloc(sizeof(char **) * 1024);
for(k = 0; k < 1024; k++) {
    cmd[k] = malloc(sizeof(char *) * 1024);
    for( j = 0; j < 1024; j++)
           cmd[k][j] = malloc(1024);
}
于 2013-07-05T13:21:13.087 に答える
0

1 文字よりも長い区切り文字で文字列を分割する場合は、文字列検索で次のように行うことができます。

次の関数は、入力文字列と区切り文字列を受け入れます。char **dでなければならないaを返し、free入力文字列を破棄します (メモリを再利用してトークンを保存します)。

char ** split_string(char * input, const char * delim) {
    size_t num_tokens = 0;
    size_t token_memory = 16; // initialize memory initially for 16 tokens
    char ** tokens = malloc(token_memory * sizeof(char *));

    char * found;
    while ((found = strstr(input, delim))) { // while a delimiter is found
        if (input != found) { // if the strind does not start with a delimiter

            if (num_tokens == token_memory) { // increase the memory array if it is too small
                void * tmp = realloc(tokens, (token_memory *= 2) * sizeof(char *));
                if (!tmp) {
                    perror("realloc"); // out of memory
                }
                tokens = tmp;
            }

            tokens[num_tokens++] = input;
            *found = '\0';
        }
        // trim off the processed part of the string
        input = found + strlen(delim);
    }

    void * tmp = realloc(tokens, (num_tokens +1) * sizeof(char *));
    if (!tmp) {
        perror("realloc"); // something weird happened
    }
    tokens = tmp;

    // this is so that you can count the amount of tokens you got back
    tokens[num_tokens] = NULL;

    return tokens;
}

これを再帰的に実行して、複数の区切り文字で分割する必要があります。

于 2013-07-05T15:32:52.080 に答える