首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么vsnwprintf不能将普通字符串转换为宽字符串?

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

Stack Overflow用户
提问于 2011-10-31 22:13:51
回答 2查看 818关注 0票数 0

下面的代码没有产生预期的输出。为什么?

代码语言:javascript
复制
    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中运行的。很抱歉给您带来了混乱!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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函数打印宽字符串,但在执行另一种操作时不知何故忘记了这一点。)

票数 3
EN

Stack Overflow用户

发布于 2011-10-31 22:22:27

尝试使用%s进行转换,而不是%S。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7954888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档