我实际上是在对代码的一部分进行黑客操作,以使其对我的目的有用,但我无法了解这条语句到底在做什么:

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

“%.*s”具体是什么意思??
使用asprintf()函数是否安全??
或者为了同样的目的使用snprintf()函数会更好更可靠??
提前谢谢。

最佳答案

格式说明符"%.*s"用于从char*参数中打印特定数量的字符(避免要求以空结尾)。在这种情况下,packet_length字符将从in + 8打印。
man asprintf()
函数a sprintf()和vasprintf()类似于sprintf(3)和vsprintf(3),只是它们分配了一个足够大的字符串来保存包括终止空字节在内的输出,并通过第一个参数返回指向它的指针。此指针应传递给free(3),以便在不再需要时释放已分配的存储。
它在缓冲区溢出的意义上是安全的,但它是一个非标准函数(从链接的页面来看,它是GNU扩展)。在发布的代码中,缓冲区的大小在asprintf()调用之前被知道,asprintf()为程序员提供了一个方便,因为它避免了malloc()(这是必要的,以避免猜测要填充的缓冲区的最大大小)。
如果可移植性不是必需的,那么snprintf()只提供asprintf()之外的功能,而且asprintf()使用起来更方便。
由于这是标记C++,所以可以使用std::string代替:

#include <string>

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

如果真的需要,使用std::string::c_str()。这避免了手工free()asprintf()产生的缓冲区。

10-07 16:45