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);这里发生了什么,有没有办法消除错误?