下面的代码没有产生预期的输出。为什么?
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);
}EDIT:更具体地说,main中的printf应该用两个单引号将id括起来,从而输出:'2923BE84E16CD6AE529049F1F1BBE9EB‘。在这里,main的目的是说明函数中的bug,仅此而已。该函数被认为是printf系列函数的替代,后者在新分配的缓冲区中返回结果,而不是预先存在的缓冲区。这是通过带有-mno-cygwin选项(也称为mingw)的gcc-3本地编译的cygwin中运行的。很抱歉给您带来了混乱!
发布于 2011-10-31 22:20:32
根据您使用的是printf还是wprintf系列函数,%s说明符的含义会发生变化。When used with a wprintf family function, the %s specifier indicates a wide string,但您传递的是一个窄字符串。您需要%hs说“这是一个窄字符串”。
(您似乎意识到了这一点,因为您使用%ls通过printf-family函数打印宽字符串,但在执行另一种操作时不知何故忘记了这一点。)
发布于 2011-10-31 22:22:27
尝试使用%s进行转换,而不是%S。
https://stackoverflow.com/questions/7954888
复制相似问题