解析缓冲区C - 超过空格的缓冲区,存储字

时间:2009-08-27 07:33:47

标签: c++ string

自从我使用标准C库的字符串解析代码(sprintf,atoi等)以来已经有一段时间了。

我目前的具体需求如下:

advance_buf( const char*& buf, const char* removed_chars, int size );

它应该将buf指针推进到空白组之外,并将删除的字符复制到removed_chars ... size是为了保证安全。

bufremoved_chars的状态之前和之后的示例:

  • 之前:buf:“123 456 789”,removed_chars :(空或垃圾)。
  • 之后:buf:“456 789”,removed_chars:“123”。

我也对这种功能的简洁资源感兴趣。

4 个答案:

答案 0 :(得分:1)

听起来像 strtok(),朋友们可以完成你想要的工作。

答案 1 :(得分:1)

这应该是微不足道的:

const char * advance_buf(const char *buf, char *removed_chars, size_t size)
{
  /* Copy characters until whitespace found or buffer space runs out. */
  while(!isspace(*buf) && --size > 0)
    *removed_chars++ = *buf++;
  *removed_chars = '\0';

  /* Remove separating whitespace. */
  while(isspace(*buf))
    buf++;
  return buf;
}

我稍微更改了签名,以返回更新的buf指针。

答案 2 :(得分:1)

怎么样:

#define SPACE " \t"

const char *advance_buf(const char *buf, char *removed_chars, int size)
{
    buf += sprintf(removed_chars, "%.*s", min(size - 1, strcspn(buf, SPACE)), buf);
    return buf + strspn(buf, SPACE);
}

注意:如果removed_chars填满,多余的字符 将从buf中删除。

const char *buf = "123 456789 X"
char removed_chars[5];

// Before: buf: "123 456789 X", removed_chars: (empty).
buf = advance_buf(buf, removed_chars, sizeof (removed_chars));
// After: buf: "456789 X", removed_chars: "123".
buf = advance_buf(buf, removed_chars, sizeof (removed_chars));
// After: buf: "89 X", removed_chars: "4567".

注意2:虽然sprintf调用是安全的,因为"%.*s"防止缓冲区溢出,但是一些现代编译器会为任何使用sprintf()生成警告一些公司的编码标准禁止它。如果是这样,那么替换snprintfsprintf_s

应该是微不足道的

答案 3 :(得分:0)

我建议您查看strspn()strcspn()函数。以下内容将告诉您在下一个空格块之前有多少个字符:

strcspn(string, " \t");

以下内容将告诉您一大块空白是多长时间:

strspn(string, " \t");

您可以使用这些数字轻松完成此任务,如果需要,可以使用线程安全。