2

fscanf (gcc を使用した C コード) を使用してファイルから IP を解析したい。だから、私はやりたい:

char myip[INET_ADDRSTRLEN];
fscanf(file, "%16s", myip);

しかし、16 という数字をハードコーディングしたくないので、マクロを使用しようとしていますが、うまくいきません。

#define _STRIFY(x) #x
char myip[INET_ADDRSTRLEN];
fscanf(file, "%" _STRIFY(INET_ADDRSTRLEN) "s", myip);

ここに私が得るエラーがあります

unknown conversion character type 'N' format

私のコードの何が問題なのですか?

ご協力いただきありがとうございます :)

4

2 に答える 2

4

これはどう?

char format[14];
sprintf(format, "%%%ds", INET_ADDRSTRLEN-1);
fscanf(file, format, myip);
于 2012-09-26T18:18:00.453 に答える
2

これを使って:

#define stringify_1(x...)  #x
#define stringify(x...)    stringify_1(x)

char myip[INET_ADDRSTRLEN];
fscanf(file, "%" stringify(INET_ADDRSTRLEN) "s", myip);

これらは、Linux カーネルで使用される stringify 関数のようなマクロです。

私のコメントで、バッファ サイズと変換仕様のサイズに同じ値を使用すると、バッファ オーバーフローに対して脆弱になることを確認してください。たとえばINET_ADDRSTRLEN + 1、バッファ宣言で使用して、オーバーフローの可能性を回避します。

于 2012-09-26T18:17:45.187 に答える