【问题标题】:Splitting a string by space in C在C中按空格分割字符串
【发布时间】:2010-09-24 07:26:01
【问题描述】:

我正在使用 C 并且通过一个套接字我将收到一条带有一个空格的消息,我需要将字符串拆分为空格处的部分。我该怎么做呢?

【问题讨论】:

标签: c string


【解决方案1】:

strtok_r 是你的朋友。

不要使用普通的strtok(),因为它不是线程安全的。

即使在线程安全的平台上(因为状态保存在线程本地存储中),仍然存在使用内部状态意味着您不能同时从多个字符串解析令牌的问题。

例如,如果您编写一个使用strtok() 来分隔字符串A 的函数,则您的函数不能在使用strtok() 来分割字符串B 的第二个函数的循环内调用。

【讨论】:

  • 在某些平台上可能会出现这种情况,但在 MSVC 上却不是这样。 strtok 是线程安全的,其他各种传统上使用静态存储的 CRT 函数也是如此。
  • @Will - 已更新。如果我没记错的话,它对 TLS 的使用仍然意味着您不能同时处理两个字符串...
【解决方案2】:

如果您拥有字符串缓冲区,并且知道修改它是安全的,您可以按照人们的建议使用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'.
}

这可能会更快和/或更容易理解,具体取决于上下文。

【讨论】:

    【解决方案3】:

    这通常使用strtok() 库调用来完成。但是请注意,此函数将修改输入字符串(它会在找到所选分隔符的任何地方插入 '\0' NUL 字符) - 因此,如果需要,您可能需要在字符串的副本上调用 strtok()稍后访问整个内容。

    编辑:正如另一张海报所提到的,“普通” strtok() 不是线程安全的,因此 strtok_r() 是更安全的调用函数。我不确定 strtok_r() 是否存在就地修改输入缓冲区的相同问题。

    【讨论】:

    • strtok_r 是一个 Posix 函数。它可能在 Windows 上不可用。
    • Microsoft strtok 线程安全的,从我记事起就一直如此。 “静态”数据实际上保存在线程本地存储中。
    • MS 上的 strtok() 可能是线程安全的,但它不是可重入的;一次只能使用一位代码。也就是说,您不能让 FunctionA() 使用 strtok() 来解析字符串,并让它调用 FunctionB() ,其中 FunctionB() 也调用 strtok() 来解析不同的字符串。 FunctionA() 现在搞砸了!
    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多