使用strtok()将字符串拆分为字符串无法正常工作

时间:2016-12-22 21:51:20

标签: c delimiter strtok

关于分离传递给函数的字符串的内容,我遇到了问题。使用如下字符串调用该函数:

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()将每个键和值存储在单独的变量中。请注意,我尝试存储第二个和第三个值(Nathaniel50)而不是第一个位(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;
}

但我仍然遇到相同的分段错误(核心转储)错误

2 个答案:

答案 0 :(得分:4)

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

token = strtok(buffer_copy, delim);

然后,当您想获取密钥和值时,需要将它们复制到数组中:

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

您不需要循环,因为您只想提取这两个值。

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

char *key, *value;

然后你可以这样做:

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

答案 1 :(得分:1)

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

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

strcpy(buffer_copy, buffer);
token = strtok(buffer_copy, delim);

此外,当您在while循环中检测到令牌时,您将其丢弃。你想在那时做点什么(或者只是展开循环并调用strtok三次)。

此外:

const char* delim = ":";

将是确保NUL终止字符串的更常规方式:

const char delim[2] = ":";

同时考虑使用strtok_r而不是strtok因为strtok不是线程安全且可怕的。虽然你没有在这里使用线程(看起来如此),但你也可以进行良好的练习。