我的数据如下:
protocolAction:dataA:dataB
然后我需要获取标题(protoclAction
)和2个数据字段。
我这样做 - 并告诉它不是线程安全且不健康:
//data is global
char incomingData[200] = {0};
char *header = strtok (incomingData,":");
char *dataA=strtok (NULL, ":");
char *dataB=strtok (NULL, ":");
我最好但又简单的选择是提取字段而不是此代码?
答案 0 :(得分:4)
“不健康”?它不是线程安全的,通常不是一个问题。如果 是一个问题并且您在POSIX系统上,请改用strtok_r()
。如果您不在POSIX上,请提供您自己的strtok_r()
。
总的来说,这是我自己的strtok()
实现(对于某些DOS编程需要它):
static int _isinstr(const char c, const char *str)
{
while (*str)
{
if (c == *str) return 1;
++str;
}
return 0;
}
char *strtok(char *str, const char *delim)
{
static char *strtokptr = 0;
char *p;
int t = 0;
if (!str) str = strtokptr;
if (!str) return 0;
p = str;
while (*p)
{
if (_isinstr(*p, delim))
{
if (!t) goto cont;
*p = 0;
strtokptr = p+1;
return str;
}
if (!t)
{
t = 1;
str = p;
}
cont:
++p;
}
if (t && p > str)
{
strtokptr = 0;
return str;
}
return 0;
}
strtok_r()
所要做的就是删除静态strtokptr
,而是添加一个参数char **strtokptr
,并在所使用的strtoktpr
处添加额外的解除引用。
答案 1 :(得分:1)
作为替代方案,您可以使用sscanf
-
/* Allocate memory to pointers header ,dataA ,dataB */
/*assuming data is in incomingdata and it is null terminated */
if(sscanf(incomingData,"%[^:]:%[^:]:%s",header,dataA,dataB)==3){
// do something with these variables
}