gpt4 book ai didi

c - 调用中的strtok问题

转载 作者:太空宇宙 更新时间:2023-11-04 00:56:11 24 4
gpt4 key购买 nike

我有一个像这样使用 strtok 的函数

void f1(char *name)
{
...
char *tmp;
tmp = strtok(names, " ,");
while(tmp)
{
...
tmp = strtok(NULL, " ,");
}
...
}

我有一个电话 f1("abc,def");

问题是在第一次调用时 f1 得到 abc,def在第二次通话中只得到 abc

我很困惑..为什么会这样?

最佳答案

strtok() 通过用 0 覆盖分隔符来修改其输入字符串;因此,假设您的代码如下所示:

char parm[] = "abc,def";

f1(parm);
f1(parm);

在第一次调用 f1 后,',' 字符被 0 覆盖,这是一个字符串终止符,因此第二次调用仅将“abc”视为字符串。

请注意,因为 strtok() 修改了它的输入,所以您不想将字符串文字作为参数传递给它;尝试修改字符串文字的内容会调用未定义的行为。

安全的做法是在 f1 中创建一个本地字符串并将 names 的内容复制到它,然后将该本地字符串传递给 strtok()。以下应适用于 C99:

void f1(char *name)
{
size_t len = strlen(name);
char localstr[len+1];
char *tmp;
strcpy(localstr, name);

tmp = strtok(localstr, " ,");
while(tmp)
{
...
tmp = strtok(NULL, " ,");
}
}

关于c - 调用中的strtok问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2581047/

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