C++ 解析缓冲区C-将缓冲区向前推进超过空白,存储字

C++ 解析缓冲区C-将缓冲区向前推进超过空白,存储字,c++,string,C++,String,我使用标准C库的字符串解析代码(sprintf、atoi等)已经有一段时间了 我目前的具体需求如下: advance_buf( const char*& buf, const char* removed_chars, int size ); 它应该将buf指针前进到空白组之外,并将删除的字符复制到removed\u chars。。。大小是为了保证安全 示例前后,buf和removed\u chars的状态: 在:buf:“123 456 789”之前,已删除字符(空或垃圾) 在:bu

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

我目前的具体需求如下:

advance_buf( const char*& buf, const char* removed_chars, int size );
它应该将
buf
指针前进到空白组之外,并将删除的字符复制到
removed\u chars
。。。
大小
是为了保证安全

示例前后,
buf
removed\u chars
的状态:

  • 在:
    buf
    :“123 456 789”之前,
    已删除字符(空或垃圾)
  • 在:
    buf
    :“456789”之后,
    删除了字符
    :“123”

我还对这类函数的简洁资源感兴趣。

听起来像strtok(),朋友可以做你想做的工作。

听起来像strtok(),朋友可以做你想做的工作。

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

strcspn(string, " \t");
下面将告诉您一大块空白的长度:

strspn(string, " \t");

您可以很容易地使用这些数字来完成这项任务,如果需要,还可以安全地执行。

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

strcspn(string, " \t");
下面将告诉您一大块空白的长度:

strspn(string, " \t");

您可以使用这些数字非常轻松地完成此任务,如果需要,还可以安全地执行此任务。

这应该很简单:

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
指针。

这应该很简单:

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
指针。

如何:

#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\u 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()
的任何使用生成警告,一些公司的编码标准禁止这样做。如果是这样的话,那么替换
snprintf
sprintf\u s
应该是很简单的,那么:

#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\u 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()
的任何使用生成警告,一些公司的编码标准禁止这样做。如果是这样的话,那么替换
snprintf
sprintf_s

应该很简单,您需要声明
const char**buf
。C没有引用。真的已经有一段时间了,不是吗?如果是C,不要混淆C++的引用。C++的语法使我对我感兴趣的东西更清楚了,至少对我来说。char **是一个最终的模糊符号。如果你想要C++语法,这个标签应该被标记为C++。我不关心函数的语法。以上是我描述所需功能的最简单、最清晰的方式。我希望学习1。C和2中的标准方法是什么。这是查找类似函数的好资源。您需要声明
const char**buf
。C没有引用。真的已经有一段时间了,不是吗?如果是C,不要混淆C++的引用。C++的语法使我对我感兴趣的东西更清楚了,至少对我来说。char **是一个最终的模糊符号。如果你想要C++语法,这个标签应该被标记为C++。我不关心函数的语法。以上是我描述所需功能的最简单、最清晰的方式。我希望学习1。C和2中的标准方法是什么。这是查找类似函数的一个很好的资源。我知道实现非常简单,但如果有标准的c解决方案,我更愿意使用。isblank()仅限于C99,因此isspace()更安全choice@qrdl:谢谢,我将其更改为isspace()。我知道实现非常简单,但是我更喜欢使用标准的c解决方案,如果有的话。isblank()仅是C99,所以isspace()会更安全choice@qrdl:谢谢,我把它改成了isspace()。