C 使用strtok()将字符串拆分为字符串无效

C 使用strtok()将字符串拆分为字符串无效,c,delimiter,strtok,C,Delimiter,Strtok,在分离传递给函数的字符串内容方面,我有一个问题。使用如下字符串调用函数: ADD:Nathaniel:50 bool add_to_list(char* buffer){ char key[40]; char value[40]; int* token; char buffer_copy[1024]; const char delim[2] = ":"; strcpy(buffer_copy, buffer); token = strtok(NULL, de

在分离传递给函数的字符串内容方面,我有一个问题。使用如下字符串调用函数:

ADD:Nathaniel:50
bool add_to_list(char* buffer){

  char key[40];
  char value[40];
  int* token;

  char buffer_copy[1024];
  const char delim[2] = ":";

  strcpy(buffer_copy, buffer);

  token = strtok(NULL, delim);
  //strcpy(key, token);

  printf("%d",token);
  printf("%p",token);

  while(token != NULL){
    token = strtok (NULL, delim);
  }
  //strcpy(value, token);

  printf("%s", key);
  printf("%s", value);
  push(key, value);

  return true;
}
其中ADD将是协议名称,Nathaniel将是密钥,50将是值,都用
分隔

我的代码如下所示:

ADD:Nathaniel:50
bool add_to_list(char* buffer){

  char key[40];
  char value[40];
  int* token;

  char buffer_copy[1024];
  const char delim[2] = ":";

  strcpy(buffer_copy, buffer);

  token = strtok(NULL, delim);
  //strcpy(key, token);

  printf("%d",token);
  printf("%p",token);

  while(token != NULL){
    token = strtok (NULL, delim);
  }
  //strcpy(value, token);

  printf("%s", key);
  printf("%s", value);
  push(key, value);

  return true;
}
我试图使用
strtok()
将每个键和值存储在一个单独的变量中。请注意,我试图存储的是第二个和第三个值(
Nathaniel
50
),而不是第一位(
ADD

当我运行代码时,它会给我一个分段错误,所以我猜我试图访问一个无效的内存地址,而不是一个值。我只需要存储字符串的第二位和第三位。有人能帮忙吗

编辑: 我已将代码更改为如下所示:

bool add_to_list(char* buffer){

char *key, *value, *token;

const char *delim = ":";

token = strtok(buffer, delim);

//printf("%d",token);
printf("%s",token);

key = strtok(NULL, delim);
value = strtok(NULL, delim);

printf("%s", key);
printf("%s", value);
//push(key, value);

return true;
}

但是我仍然得到相同的分段错误(内核转储)错误

strtok()
的第一次调用需要提供要扫描的字符串。您只对重复调用使用
NULL
,因此它将继续处理字符串的其余部分。因此,第一个电话应该是:

token = strtok(buffer_copy, delim);
然后,当您想要获取键和值时,需要将它们复制到数组中:

token = strtok(NULL, delim);
key = strcpy(token);
token = strtok(NULL, delim);
value = strcpy(token);
您不需要循环,因为您只想提取这两个值

实际上,您不需要将
声明为数组,您可以使用指针:

char *key, *value;
然后你可以做:

token = strtok(buffer_copy, delim);
key = strtok(NULL, delim);
value = strtok(NULL, delim);

第一次调用strtok()需要提供要扫描的字符串。您只对重复调用使用
NULL
,因此它将继续处理字符串的其余部分。因此,第一个电话应该是:

token = strtok(buffer_copy, delim);
然后,当您想要获取键和值时,需要将它们复制到数组中:

token = strtok(NULL, delim);
key = strcpy(token);
token = strtok(NULL, delim);
value = strcpy(token);
您不需要循环,因为您只想提取这两个值

实际上,您不需要将
声明为数组,您可以使用指针:

char *key, *value;
然后你可以做:

token = strtok(buffer_copy, delim);
key = strtok(NULL, delim);
value = strtok(NULL, delim);

您的主要问题是,当您第一次调用strtok时,第一个参数应该是您想要解析的字符串,所以不是:

strcpy(buffer_copy, buffer);
token = strtok(NULL, delim);
但是

此外,当您在
while
循环中检测到令牌时,您正在丢弃它们。此时您需要做一些事情(或者简单地展开循环并调用
strtok
三次)

此外:

这将是确保
NUL
终止字符串的更传统的方法,而不是:

const char delim[2] = ":";

也可以考虑使用<代码> Stotokyr 不<代码> Sttok < /Case>作为代码> Sttok不是线程安全和可怕的。虽然您在这里没有使用线程(看起来),但您还是可以进行良好的实践。

您的主要问题是,当您第一次调用
strtok
时,第一个参数应该是您要解析的字符串,所以不是:

strcpy(buffer_copy, buffer);
token = strtok(NULL, delim);
但是

此外,当您在
while
循环中检测到令牌时,您正在丢弃它们。此时您需要做一些事情(或者简单地展开循环并调用
strtok
三次)

此外:

这将是确保
NUL
终止字符串的更传统的方法,而不是:

const char delim[2] = ":";

也可以考虑使用<代码> Stotokyr 不<代码> Sttok < /Case>作为代码> Sttok不是线程安全和可怕的。虽然您没有在这里使用线程(看起来),但您还是可以进行良好的实践。

您从不在
key
value
int*token-->
char*令牌
const char[2]delim
->
const char*delim
并且为了g-d的缘故,使用
strep
而不是可怕的
strtok
。您从不在
int*令牌中存储任何内容-->
char*令牌
const char[2]delim
->
const char*delim
为了g-d起见,请使用
strep
而不是可怕的
strtok
。您能解释一下如何使用strtok\r函数吗?我试图找到有关它的信息,但我发现很难理解。此外,我的系统将像一个小型服务器,因此我将有多个线程,因此我对使用安全版本感兴趣,再加上其良好的道德规范,手册页是一个有用的资源,但下面是您应该做的。对于要进行的每个字符串标记化(即,在这里的示例中一次),添加
char*save=NULL保存
作为附加参数添加到该标记化中每次使用
strtok
,并将
strtok
更改为
strtok\u r
。这意味着
strtok\u r
将在
save
中的调用之间存储其状态,而不是存储在内部静态缓冲区中,因此您具有线程安全性。您能否解释如何使用strtok\u r函数?我试图找到有关它的信息,但我发现很难理解。此外,我的系统将像一个小型服务器,因此我将有多个线程,因此我对使用安全版本感兴趣,再加上其良好的道德规范,手册页是一个有用的资源,但下面是您应该做的。对于要进行的每个字符串标记化(即,在这里的示例中一次),添加
char*save=NULL保存
作为附加参数添加到该标记化中每次使用
strtok
,并将
strtok
更改为
strtok\u r
。这意味着
strtok\u r
将在
save
中的调用之间存储其状态,而不是存储在内部静态缓冲区中,因此您具有线程安全性。我收到一些关于以下方面的警告:警告:来自不兼容指针类型[-Wincompatible pointer types]token=strtok(buffer\u copy,delim);这里发生了什么,有没有办法消除错误?