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