为什么strtok_s在我使用StrDup时有效?

时间:2014-05-30 15:29:19

标签: c windows string

我使用带有分配字符串的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的情况下更正此代码?

2 个答案:

答案 0 :(得分:2)

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并且你指向分配的空间(这是你的意图),但是你然后把它改为指向只读的东西,交流字符串不变。由于strtok_s需要能够写入缓冲区,因此会失败。当您strdup()时,您创建另一个(可写)字符串副本。

除了设置string1 = "some constant string";之外,您可以使用strcpy()(其中一个长度限制版本,为安全起见)将只读字符串常量复制到缓冲区中。这可以帮助您在没有strdup()的情况下完成任务,但由于strdup()为您执行分配,您可以直接进行分配/复制,从而轻松完成工作。

答案 1 :(得分:1)

这一行

string1 = "A string\tof ,,tokens\nand some  more tokens";

不符合您的预期。

您希望将常量字符串的内容写入string1指向的内存缓冲区。你实际做的是将string1的值更改为指向由编译器分配以保存常量字符串的内存。

做你想做的事的一种方法是

strcpy(string1, "A string\tof ,,tokens\nand some  more tokens");