关于分离传递给函数的字符串的内容,我遇到了问题。使用如下字符串调用该函数:
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;
}
但我仍然遇到相同的分段错误(核心转储)错误
答案 0 :(得分:4)
第一次调用strtok()
需要提供要扫描的字符串。您只对重复的调用使用NULL
,因此它将继续处理字符串的其余部分。所以第一个电话应该是:
token = strtok(buffer_copy, delim);
然后,当您想获取密钥和值时,需要将它们复制到数组中:
token = strtok(NULL, delim);
key = strcpy(token);
token = strtok(NULL, delim);
value = strcpy(token);
您不需要循环,因为您只想提取这两个值。
实际上,您不需要将key
和value
声明为数组,您可以使用指针:
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
不是线程安全且可怕的。虽然你没有在这里使用线程(看起来如此),但你也可以进行良好的练习。