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()という点でプログラマーに便利です。malloc()

移植性が要件ではない場合は、それ以上のことsnprintf()は何も提供せず、使用するasprintf()asprintf()がより便利です。

これはC++とタグ付けされているため、std::string代わりに次のものを使用できます。

#include <string>

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

std::string::c_str()本当に必要な場合は使用してください。free()これにより、によって生成されたバッファを手動で作成する必要がなくなりasprintf()ます。

于 2012-09-17T07:42:39.407 に答える