0

我实际上是在破解一部分代码以使其对我的目的有用,但我无法得到这个语句的确切作用:

    asprintf(&buffr, "%.*s", packet_length, in + 8);

“%.*s”具体是什么意思??使用 asprintf() 函数是否安全?或者出于相同目的使用 snprintf() 函数会更好更可靠?

提前致谢。

4

1 回答 1

3

格式说明符"%.*s"用于从参数打印特定数量的字符char*(避免空终止的要求)。在这种情况下,packet_length字符将从 打印in + 8

来自man asprintf()

函数 asprintf() 和 vasprintf() 是 sprintf(3) 和 vsprintf(3) 的类似物,不同之处在于它们分配了一个足够大的字符串来保存包括终止空字节在内的输出,并通过第一个参数返回指向它的指针. 这个指针应该被传递给 free(3) 以在不再需要时释放分配的存储空间。

它在缓冲区溢出的意义上是安全的,但它是一个非标准函数(从链接的页面来看,它是一个 GNU 扩展)。asprintf()在已发布代码的上下文中,在调用之前已知缓冲区的大小,这asprintf()为程序员提供了便利,因为它避免了 a malloc()(这是避免猜测要填充的缓冲区的最大大小所必需的) .

如果便携性不是必需的,那么就snprintf()没有什么额外的了asprintf(),而且asprintf()使用起来更方便。

由于这是标记为 C++,您可以使用 astd::string代替:

#include <string>

std::string s(in + 8, packet_length);

std::string::c_str()在确实需要时使用。这避免了必须手动free()生成由asprintf().

于 2012-09-17T07:42:39.407 回答