【发布时间】:2010-09-24 07:26:01
【问题描述】:
我正在使用 C 并且通过一个套接字我将收到一条带有一个空格的消息,我需要将字符串拆分为空格处的部分。我该怎么做呢?
【问题讨论】:
-
我在另一篇文章 [这里][1] 中回答了这个问题。 [1]:stackoverflow.com/a/22118068/3368887
我正在使用 C 并且通过一个套接字我将收到一条带有一个空格的消息,我需要将字符串拆分为空格处的部分。我该怎么做呢?
【问题讨论】:
strtok_r 是你的朋友。
不要使用普通的strtok(),因为它不是线程安全的。
即使在线程安全的平台上(因为状态保存在线程本地存储中),仍然存在使用内部状态意味着您不能同时从多个字符串解析令牌的问题。
例如,如果您编写一个使用strtok() 来分隔字符串A 的函数,则您的函数不能在使用strtok() 来分割字符串B 的第二个函数的循环内调用。
【讨论】:
如果您拥有字符串缓冲区,并且知道修改它是安全的,您可以按照人们的建议使用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'.
}
这可能会更快和/或更容易理解,具体取决于上下文。
【讨论】:
这通常使用strtok() 库调用来完成。但是请注意,此函数将修改输入字符串(它会在找到所选分隔符的任何地方插入 '\0' NUL 字符) - 因此,如果需要,您可能需要在字符串的副本上调用 strtok()稍后访问整个内容。
编辑:正如另一张海报所提到的,“普通” strtok() 不是线程安全的,因此 strtok_r() 是更安全的调用函数。我不确定 strtok_r() 是否存在就地修改输入缓冲区的相同问题。
【讨论】: