我想分配一个char ***。 我有一个这样的句子:“这是一个命令&&我需要;分裂” 我需要在每个方框中放入一个完整的句子:
cmd[0] = "This is a command"
cmd[1] = "wich I"
cmd[2] = "need to"
cmd[3] = "split"
句子由&&, ||, ;, |
之类的标记分隔
我的问题是我不知道如何分配我的三维数组。
我总是遇到分段错误。
这就是我的所作所为:
for(k = 0; k < 1024; k++)
for( j = 0; j < 1024; j++)
cmd[k][j] = malloc(1024);
但稍后几行,在另一个循环中:
» cmd[k][l] = array[i];
我在这里遇到了段错误。
我该怎么办? 提前致谢
答案 0 :(得分: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);
}
答案 1 :(得分:0)
如果你要用比单个字符更长的分隔符拆分你的字符串,那么你可以用字符串搜索来完成它。
以下函数将接受输入字符串和分隔符字符串。
它将返回一个char **
,它必须是free
d并且它会破坏你的输入字符串(重用它的内存来存储标记)。
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;
}
您需要以递归方式运行它以拆分多个分隔符。