我将 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/