gpt4 book ai didi

c - 使用 free() 使 strtok 返回的字符串为空

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:45 26 4
gpt4 key购买 nike

我有以下方法

void set_actions(char *input, char **actions)
{
int index = 0;
char *str = (char*)malloc(strlen(input));
strcpy(str,input);
char *tok = NULL;
tok = strtok(str," ");

while(tok!=NULL)
{
actions[index]=tok;
tok=strtok(NULL," ");
index++;
}

free(str);
}

在 main 中调用此方法后:

char *input ="A B C";
char *actions[3];
set_actions(input, actions);

结果是:

actions[0] = is empty
actions[1] = is empty
actions[2] = C

如果我删除“free(str)”然后

actions[0] = A
actions[1] = B

我做错了什么?

最佳答案

strtok 就地修改字符串。所以它返回的子字符串实际上是您为 str 分配的缓冲区段,它们不在单独的内存区域中。

在 C 中,字符串一直运行到下一个空字节(字节值为 0)。 strtok 的工作方式是将字符串分隔符替换为空字节。所以你以前在哪里

+-----+-----+-----+-----+-----+-----+
| 'A' | '␣' | 'B' | '␣' | 'C' | 0 |
+-----+-----+-----+-----+-----+-----+
^
str

(其中'␣'是一个空格字符),然后在调用strtok之后,你有

+-----+-----+-----+-----+-----+-----+
| 'A' | 0 | 'B' | 0 | 'C' | 0 |
+-----+-----+-----+-----+-----+-----+
^ ^ ^
actions[0] actions[1] actions[2]
str

只要您还在使用 token ,就不能释放 str。复制 token ,或保留 str

关于c - 使用 free() 使 strtok 返回的字符串为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20759952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com