我对编程很陌生,对我的生活来说,我无法解决这个问题。我正在尝试创建一个函数,该函数以空格作为分隔符和指向字符串的指针以及作为参数的标记数来标记字符串。该函数应该返回一个char数组,该数组带有已标记的字符串Ex。将"( 2+(5-3) )“转换为{ "(”、"2“、"+”、"(“、"5”、"-“、"3”、")“、")"}。我的代码如下:
char** get_tokens(char* str, int n_tokens)
{
char *new;
int i = 0;
char ** new_arr = malloc(sizeof(char) * n_tokens);
if(new_arr == NULL)
return NULL;
new = strtok(str, " ");
while(new != NULL)
{
printf("%s\n", new);
new = strtok(NULL, " ");
}
char** p;
return p;
}char** p行只是没有编译错误的填充代码。
我相信我已经正确地使用了strtok(),但是我遇到困难的部分是理解返回类型。我不确定如何利用char**返回,并有一个带有标记字符串的数组供以后使用。如果有人能帮助解释指向指针返回类型的指针,以及帮助我的代码做我想做的事情的方法,我们将不胜感激。
发布于 2018-11-12 20:56:21
char **可以指向char *数组,这是您想要返回的。
在循环中,您希望将strtok的返回值分配给new_arr指向的数组的元素。您还希望为大小为sizeof(char *)的元素分配空间,而不是为sizeof(char)分配空间。
char ** new_arr = malloc(sizeof(char *) * n_tokens);
if(new_arr == NULL)
return NULL;
new = strtok(str, " ");
while(new != NULL)
{
printf("%s\n", new);
new_arr[i++] = new;
new = strtok(NULL, " ");
}
return new_arr;这是在假设n_tokens的值是正确的情况下工作的。如果您不知道有多少令牌,仍然可以通过使用realloc展开数组的大小来做到这一点:
char ** new_arr = malloc(sizeof(char *));
if(new_arr == NULL)
return NULL;
new = strtok(str, " ");
while(new != NULL)
{
printf("%s\n", new);
new_arr[i++] = new;
new_arr = realloc(new_arr, sizeof(char *) * (i + 1));
if (new_arr == NULL) {
return NULL;
}
new = strtok(NULL, " ");
}
return new_arr;https://stackoverflow.com/questions/53269882
复制相似问题