我正在使用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()是否存在相同的问题,即原地修改输入缓冲区。