2011-10-31 165 views
0

以下代碼不會產生預期的輸出。爲什麼?vsnwprintf爲什麼不將普通字符串轉換爲寬字符串?


    wchar_t* wchar_t_printf_return(wchar_t* formatstring, ...){ 
     va_list argp; 
     va_start(argp, formatstring); 
     int templen = 256; 
     templen = vsnwprintf(NULL, 0, formatstring, argp)+3; 
     wchar_t *buffer = (wchar_t *) malloc ((templen+1)*sizeof(wchar_t)); 
     memset(buffer, 0, (templen+1)*sizeof(*buffer)); 
     int retval; 
     while ((retval = vsnwprintf(buffer, templen, formatstring, argp)) == -1 || (retval >= (templen-1))){ 
      templen = templen << 1; 
      buffer = (wchar_t *) realloc (buffer, (templen+1)*sizeof(wchar_t)); 
      va_end(argp); 
      va_start(argp, formatstring); 
     } 
     va_end(argp); 
     buffer[templen] = L'\0'; 
     return buffer; 
    } 

    int main(){ 
     int i; 
     char *id = "2923BE84E16CD6AE529049F1F1BBE9EB"; 
     wchar_t *val = wchar_t_printf_return(L"'%s'", id); 
     printf("%ls\n", val); 
    } 

編輯:到狀態更具體地,在主中的printf應包裹在ID兩個單引號從而輸出:「2923BE84E16CD6AE529049F1F1BBE9EB」。這裏的主要目的是爲了說明函數中的錯誤,沒有更多。該函數應該是printf家族函數的一個替代,它將結果返回到新分配的緩衝區而不是預先存在的緩衝區。這是在cygwin中通過gcc-3使用-mno-cygwin選項(又名mingw)編譯的。對困惑感到抱歉!

+0

如果你包含了你的函數的其餘部分,它可能會有所幫助,因此它可能包含返回的內容。如果你包含a)在簡單情況下返回的內容(例如用一些瑣碎內容替換你的id)和b)你期望返回的內容,這也可能有幫助。 – mah

+1

令人討厭的代碼;討厭的問題。如果你給了我們意想不到的輸出和預期的輸出,這將有所幫助......! – noelicus

+0

看起來像一團糟 - 該功能應該做什麼? – trojanfoe

回答

3

%s說明符根據您使用的是printf還是wprintf系列函數而有所不同。 When used with a wprintf family function, the %s specifier indicates a wide string,但你傳遞一個窄的字符串。你需要%hs來說「這是一個狹窄的字符串。」

(你好像因爲你用%ls打印寬字符串與printf - 家庭功能,意識到這一點,但走另一條路,當你不知何故忘了。)

+0

現在工作,我不小心抹去了廣泛的演員陣容。謝謝! – chacham15

+0

@Raymond:這是C標準的一部分,還是微軟的怪癖? –

+0

不清楚「this」是指什麼,但無論哪種方式,您都可以自己去查閱標準。 –

1

嘗試使用%S爲翻譯,而不是%s。

+0

也可以,謝謝! – chacham15