以下代碼不會產生預期的輸出。爲什麼?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)編譯的。對困惑感到抱歉!
如果你包含了你的函數的其餘部分,它可能會有所幫助,因此它可能包含返回的內容。如果你包含a)在簡單情況下返回的內容(例如用一些瑣碎內容替換你的id)和b)你期望返回的內容,這也可能有幫助。 – mah
令人討厭的代碼;討厭的問題。如果你給了我們意想不到的輸出和預期的輸出,這將有所幫助......! – noelicus
看起來像一團糟 - 該功能應該做什麼? – trojanfoe