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