2017-11-04 7 views
0

以下のコード上で動作しているvsprintfの次の値を返します。は、なぜ最初の文字だけ

Input was: 6789 
Vsprintf Buffer: 54 

なぜ唯一の54を返すvsprintfバッファがありますか?

#include <stdarg.h> 
#include <stdio.h> 

void vout(char *string, char *fmt, ...); 
char fmt1 [] = "%d"; 

int main(void) 
{ 
    char string[32]; 
    char *xy = "6789"; 

    vout(string, fmt1, * xy); 
    printf("Input was: %s\n", xy); 
    printf("Vsprintf Buffer: %s\n",string); 
} 

void vout(char *string, char *fmt, ...) 
{ 
    va_list arg_ptr; 

    va_start(arg_ptr, fmt); 
    vsprintf(string, fmt, arg_ptr); 
    va_end(arg_ptr); 
} 
+2

「54」は「6」のASCIIコードです。 –

+0

しかし、それはあなたのコードで何をしているのかを正確に明示的に示しています。 'xy'の最初の文字だけを' vout'に渡し、その整数値をstringに変換します。 '* xy'は' xy'の最初の文字です。あなたは意図的にそれを自分で見つけました。それではなぜ質問ですか? – AnT

+0

結果が気に入らない場合は、**常に**期待どおりの結果が含まれていてください。 – Gerhardh

答えて

1

あなたは、単一の文字'6'を渡し、フォーマット%dでそれを印刷し、それは整数として文字コードを印刷している - 54

0

vsprintf()は、arg_ptrからfmtを読み取り、文字列に出力します。この場合、アスキー文字 '6'を含む最初の32ビットメモリブロックが使用され、文字列に整数として書き込まれるため、これは機能しません。代わりにvsscanfを使用してください。

vsscanf(string, fmt, arg_ptr); 
+0

これは、ありがとう... – user1698144

+0

また、vsscanfとvsprintfの引数の順序を覚えておく簡単な方法は、引き数は基本的にscanfとprintfと同じで、引数の前の文字配列stdinの代わりに/から書き込まれます。 – id0

関連する問題