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

标签 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 的情况下更正此代码?

最佳答案

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/

相关文章:

c - 将字符串 "comes from a file "解析为整数

c - 为什么 while 循环中 '*s-*t"的结果是 "67"?

c - 在结构中使用带字符串指针的点运算符与箭头运算符

c - 是否可以修改正在运行的 C 程序?

c++ - CryptGenRandom 在循环调用时给出相同的值

python - 在另一台计算机上运行 pyinstaller .exe 文件时缺少 .dll

java - 在 Java 中创建 UNIX Echo 类

CRC位序困惑

windows - 在 Windows 上使用 python3 忽略 PYTHONPATH

java - 字符串中的字符串替换