vsnwprintf为什么不将普通字符串转换为宽字符串?

问题描述:

以下代码不会产生预期的输出。为什么?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

看起来像一团糟 - 该功能应该做什么? – *foe

%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”是指什么,但无论哪种方式,您都可以自己去查阅标准。 –

尝试使用%S为翻译,而不是%s。

+0

也可以,谢谢! – chacham15