我正在使用C并通过套接字我将收到一条消息,其中包含一个空格,我需要将字符串拆分为空格中的部分。我该怎么做呢?
答案 0 :(得分:14)
strtok_r是你的朋友。
不要使用普通strtok()
,因为它不是线程安全的。
即使在线程安全的平台上(因为状态保存在线程局部存储中),仍然存在使用内部状态意味着无法同时解析多个字符串中的令牌的问题。
例如,如果编写一个使用strtok()
分隔字符串A的函数,则无法在使用strtok()
分割字符串B的第二个函数的循环内调用您的函数。
答案 1 :(得分:5)
如果您拥有字符串缓冲区,并且知道可以安全修改,则可以按照人们的建议使用strtok_r()
。或者你可以自己做,像这样:
char buffer[2048];
char *sp;
/* read packet into buffer here, omitted */
/* now find that space. */
sp = strchr(buffer, ' ');
if(sp != NULL)
{
/* 0-terminate the first part, by replacing the space with a '\0'. */
*sp++ = '\0';
/* at this point we have the first part in 'buffer', the second at 'sp'.
}
根据具体情况,这可能会更快和/或更容易理解。
答案 2 :(得分:0)
这通常使用strtok()库调用来完成。但是,请注意,此函数将修改输入字符串(它会在找到所选分隔符的位置插入'\ 0'NUL字符) - 因此,如果需要,您可能需要在字符串的副本上调用strtok()以后访问整个事情。
编辑:正如另一张海报所提到的,“plain”strtok()不是线程安全的,所以strtok_r()是更安全的函数。我不确定strtok_r()是否存在同样修改输入缓冲区的问题。