2017-11-04 31 views
0

操作下面的代碼返回以下結果:爲什麼vsprintf中只在第一個字符

Input was: 6789 
Vsprintf Buffer: 54 

爲什麼vsprintf緩衝器僅返回54?

#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'並將其整數值轉換爲字符串。 '* xy'是'xy'的第一個字符。你故意單挑出來,就在那裏。爲什麼這個問題呢? – AnT

+0

如果你不喜歡結果,請**總是**包括你的預期結果是什麼。 – Gerhardh

回答

1

你傳遞一個字符'6'與格式%d打印出來,所以它打印的字符代碼作爲整數 - 54

0

vsprintf()從arg_ptr中讀取fmt並打印到字符串。這將不起作用,因爲它將採用第一個32位內存塊,在這種情況下,它包含ascii字符'6',並將其作爲整數寫入字符串。改用vsscanf。

vsscanf(string, fmt, arg_ptr); 
+0

明白了,謝謝.. – user1698144

+0

而且,記住vsscanf和vsprintf的參數順序的簡單方法是參數基本上與scanf和printf相同,只是在參數前面有一個字符數組,它被讀取從/寫入而不是標準輸入。 – id0

相關問題