首页 > 解决方案 > G-WAN C 函数 xbuf_trunclen() 和 xbuf_truncptr()

问题描述

我想使用 xbuf_trunclen() 和 xbuf_truncptr() 函数来削减我的缓冲区,但这些函数似乎不起作用。

这是一个通过 char 指针运行的示例:

char *string = (char*)strdup("---Boundary");
string += 3;
printf("String is '%s'", string);

结果:字符串为“边界”

这是我想做但似乎不起作用的事情:

xbuf_t buffer;
xbuf_init(&buffer);
xbuf_cat(&buffer, "---Boundary");
xbuf_trunclen(&buffer, 3);
printf("Buffer is '%s'", buffer.ptr);

结果:缓冲区为'---边界'

虽然我想:缓冲区是“边界”

并使用“xbuf_trunptr()”:

...
char *ptr = (char*)strdup("Boundary");
xbuf_truncptr(&buffer, ptr);
...

结果:缓冲区为'---边界'

虽然我想:缓冲区是“边界”

这是我的使用错误还是两个功能的操作问题?目标是操纵缓冲区的开头。

标签: ctruncateg-wan

解决方案


在您的代码中,您复制了xbuffer's 缓冲区,因此(ptr!= buffer.ptr):

char *ptr = (char*)strdup("Boundary");
xbuf_truncptr(&buffer, ptr);

这样做是行不通的:ptr必须属于 [ buffer.ptr, buffer.ptr + buffer.len] 内存范围。这也可以:ptr[3] = 0;

而且,如果您只想使用 xbuf_trunclen() 剪切字符串,那么执行以下操作会更快:

缓冲区.ptr[3] = 0;

希望这可以帮助。

注意:回顾起来,看看这两个函数让我想知道为什么首先创建它们。我猜它是针对 Java 和 C# API 和开发人员的(因为这两种语言都不使用类似 C 的“字符串”并将它们封装在隐藏结构中)。


推荐阅读