gpt4 book ai didi

c - strtok() 的用法

转载 作者:行者123 更新时间:2023-11-30 20:04:20 26 4
gpt4 key购买 nike

我尝试使用 insertItem() 列表 api 成功插入所有类型的项目,例如字符串(如下),

static void copyData(List *records, char *delim, char *argv[]){

char *item = malloc(5);
strcpy(item, "abcd");
int count = 0;
while(count++ < 10){

insertItem(records, item);

item = malloc(5);
strcpy(item, "efgh");
}
}
<小时/>

输出:

$ ./frequencyCounter.exe ARRAY
Key is:abcd
Key is:efgh
Key is:efgh
Key is:efgh
Key is:efgh
Key is:efgh
Key is:efgh
Key is:efgh
Key is:efgh
Key is:efgh
Size of list: 10
Before freeList()After freeList()
<小时/>

但是strtok() tokens显示有问题的代码,如下所示,上面不需要buf[]参数,

static void copyData(List *records, char buf[], char *delim, char *argv[]){

char *token = strtok(buf, delim);

void *item = malloc(strlen(token) + 1);
item = memcpy(item, token, strlen(token)+1);
printf("token-%s\n", token);
while(token != NULL){

insertItem(records, item);
token = strtok(NULL, delim);
if(token != NULL){
printf("token-%s\n", token);
item = malloc(strlen(token) + 1); //every item has its own heap memory
memcpy(item, token, strlen(token)+1);
}
}

}
<小时/>

输出是,

$ ./frequencyCounter.exe ARRAY
token-it
token-was
token-the
token-best
token-of
token-times
Key is:it
Key is:it
Key is:it
Key is:it
Key is:it
Key is:it
Size of list: 6
Aborted (core dumped)
<小时/>

在上面的问题代码中,我们可以重用strtok()的结果吗?

最佳答案

虽然很难理解或阅读你的代码,但下面的代码看起来很糟糕

item = malloc(strlen(token));

然后你memcpy() strlen(token) + 1字节。

这将导致未定义的行为,因此您的程序将表现不稳定。

另外,不要过度使用 strlen() 它会在每次调用它时迭代输入字符串的所有字符,如果您需要使用它超过一次。

这是您的函数的改进版本

static void 
copyData(List *records, char buf[], char *delim, char *argv[])
{
char *token;
size_t length;
void *item;

token = strtok(buf, delim);
if (token == NULL)
return;
length = strlen(token);
item = malloc(length + 1);
if (item == NULL)
return;
memcpy(item, token, length + 1);

printf("token-%s\n", token);
while (token != NULL) {
insertItem(records, item);

token = strtok(NULL, delim);
if (token != NULL) {
length = strlen(token);

item = malloc(length + 1); // every item has its own heap memory
if (item != NULL) {
memcpy(item, token, length + 1);
}
printf("token-%s\n", token);
}
}
// Some day, you will have to free these pointers
}

但我希望事情不只是这样,因为你malloc()的每一个item都永远不会被free释放,而且,因为它有点违反了DRY原则。还有一件事,您也可以使用 strdup()

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

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