在c中标记字符串数组
Tokenizing an array of string in c
我是编程新手,我这辈子都搞不懂这个问题。我正在尝试创建一个函数来标记一个字符串,该字符串以 space 作为分隔符,指向字符串的指针和标记数作为参数。该函数应该 return 一个带有标记化字符串 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() 但我遇到麻烦的部分是理解 return 类型。我不确定如何使用 char** return 并拥有一个带有标记化字符串的数组供以后使用。如果有人可以帮助解释指向指针 return 类型的指针以及帮助使我的代码执行我想要的操作的方法,将不胜感激。
一个char **
可以指向一个char *
的数组,这就是你想要的return.
在您的循环中,您希望将 strtok
的 return 值分配给 new_arr
指向的数组元素。您还想为大小为 sizeof(char *)
的元素分配 space,而不是 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;
我是编程新手,我这辈子都搞不懂这个问题。我正在尝试创建一个函数来标记一个字符串,该字符串以 space 作为分隔符,指向字符串的指针和标记数作为参数。该函数应该 return 一个带有标记化字符串 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() 但我遇到麻烦的部分是理解 return 类型。我不确定如何使用 char** return 并拥有一个带有标记化字符串的数组供以后使用。如果有人可以帮助解释指向指针 return 类型的指针以及帮助使我的代码执行我想要的操作的方法,将不胜感激。
一个char **
可以指向一个char *
的数组,这就是你想要的return.
在您的循环中,您希望将 strtok
的 return 值分配给 new_arr
指向的数组元素。您还想为大小为 sizeof(char *)
的元素分配 space,而不是 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;