2017-06-17 7 views
0

私は、次のしている:は、関数の戻り値に改行を認識

$ cat 1.c 
#include <stdio.h> 

static char buf[1000]; 

const char* 
foo(void) 
{ 
    memcpy(buf, "abc", 3); 
    buf[3] = '\n'; 
    memcpy(buf+ 4, "def", 3); 
    buf[7] = '\n'; 
    buf[8] = 0; 

    return buf; 
} 

int main() 
{ 
    foo(); 

    printf("%s", buf); 

    return 0; 
} 

私はそれをコンパイル:gcc -g -O0 1.cとGDBを起動します:gdb ./a.out

私は "の行にブレークポイントを設定printf "を実行した後、呼び出しコマンドを発行してください:

(gdb) call foo() 
$4 = 0x600980 "abc\ndef\n" 

改行文字が選択されていないことがわかります。

(gdb) call printf("%s", foo()) 
abc 
def 
$5 = 8 

それは動作しますが、種類の面倒:

私はそれを回避するために、このトリックを使用しています。もっと簡潔な方法があるのだろうか?

ここでprintfを呼び出すのが最善の解決策である場合、gdbに "$ 5 = 8"を表示しないように指示する方法はありますか?

答えて

0

改行文字が選択されていないことがわかります。逆に

、あなたは(予想通り)バッファ内改行文字を見ることができます - それは何\n手段です。

もっと簡潔な方法があるのでしょうか?

GDBがすでに実装しているのは簡潔な方法です。 は冗長でのように見えます。試してみてください:

(gdb) printf "%s", foo() 

(注意:あなたはすでに試したcall printfから、この非常に異なる)