0

私はプログラムを書き、「文字列コマンド」から受け取った出力のような各文字列の出力を実現したいと考えています

int my_print(char *fmt, ...)
{
printf("%p\n",fmt);
}

int main()
{
my_print("Hello1 [%d]\n", 1);
my_print("Hello2 [%d]\n", 2);
my_print("Hello [%d]\n", 3);
my_print("Hello3 [%d]\n", 4);

そしてそれは私に出力を与えました

0x4006ac
0x4006b9
0x4006c6
0x4006d2

今、文字列コマンド「strings -tx a.out」を実行すると、出力が得られました

200 /lib64/ld-linux-x86-64.so.2
    2c1 __gmon_start__
    2d0 libc.so.6
    2da printf
    2e1 __libc_start_main
    2f3 GLIBC_2.2.5
    639 l$ L
    63e t$(L
    643 |$0H
    6ac Hello1 [%d]
    6b9 Hello2 [%d]
    6c6 Hello [%d]
    6d2 Hello3 [%d]

文字列が文字列のバイナリファイル a.out にオフセットを与えたことは知っていますが、オフセットが始まった場所からその開始アドレスを出力できるかどうかを知りたいです。たとえば、Hello1 のstrings command出力は "6ac Hello1 [%d]" と表示されますが、プログラムの出力は 0x4006ac と表示されるため、プログラムでマスク値を出力し、6ac が文字列コマンドから期待される出力であると言えます。

4

1 に答える 1

0

それが C の場合、可変引数の使用方法が間違っています。

#include <stdarg.h>

int my_print(char *fmt, ...)
{
    va_list vl ;
    va_start( vl, fmt ) ;
    vprintf(fmt, vl);
}

int main()
{
    my_print("Hello1 [%d]\n", 1);
    my_print("Hello2 [%d]\n", 2);
    my_print("Hello [%d]\n", 3);
    my_print("Hello3 [%d]\n", 4);
}

詳細は C Bookを参照してください。

あなたがしたことは次のとおりです。可変数の引数を持つ関数を定義しますが、これらの引数を使用することはありません。代わりに、文字列へのポインターとして渡し、printf の引数として扱い、まったく異なる形式を使用します。printf は、正しく、渡された文字列のポインターを出力します (これは形式として意図されていました...)。

于 2012-10-10T09:22:36.020 に答える