gpt4 book ai didi

c - 为什么当我使用 StrDup 时 strtok_s 有效?

转载 作者:行者123 更新时间:2023-11-30 18:40:59 26 4
gpt4 key购买 nike

我将 strtok_s 与分配的字符串一起使用。

上面的代码处理异常:

char *string1 = NULL;
string1 = (char*)LocalAlloc(LPTR, 100 * sizeof(char));
// TODO: Verify if string1 != NULL
string1 = "A string\tof ,,tokens\nand some more tokens";
token1 = strtok_s(cp1, seps, &next_token1);

但是当我调用 StrDup 时,我的代码可以正常工作:

cp1 = StrDup(string1);
token1 = strtok_s(cp1, seps, &next_token1);

但是我对 StrDup 的理解是它使用 LocalAlloc 为字符串的副本分配存储空间(根据 MSDN )。

那么,我的第一个示例出了什么问题?如何在不使用 StrDup 的情况下更正此代码?

最佳答案

string1 = (char*)LocalAlloc(LPTR, 100 * sizeof(char));
// TODO: Verify if string1 != NULL
string1 = "A string\tof ,,tokens\nand some more tokens";
token1 = strtok_s(cp1, seps, &next_token1);

你已经覆盖了你的指针...它从 NULL 开始,你让它指向分配的空间(这是你的意图),但你然后将它更改为指向只读的东西,一个 c 字符串常量。由于 strtok_s 需要能够写入缓冲区,这会导致它失败。当您使用 strdup() 时,您会创建该字符串的另一个(可写)副本。

您可以使用 strcpy() (为了安全起见,它的长度限制版本之一)来复制读取的内容,而不是设置 string1 = "someconstant string";仅将字符串常量放入缓冲区。这可以让您在没有 strdup() 的情况下到达需要的位置,但由于 strdup() 为您执行分配,因此直接转到它并剪切,您的工作会更容易输出分配/复制。

关于c - 为什么当我使用 StrDup 时 strtok_s 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958167/

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