wchar_t sprintf的问题

时间:2014-01-19 22:56:13

标签: c wchar printf

我正在学习如何使用wchar,但我无法使用snprintf()复制char。 我想将文本从a复制到b但它从不打印该值。我究竟做错了什么? 我想使用snprintf而不是别的。

#include <wchar.h>
#include <stdio.h>

void main() {

    printf("Start\n");
    wchar_t a[12];
    wchar_t b[] = L"984567";

    snprintf(a, sizeof(a), "%ls\0", b);

    printf("%ls\n", a);
    printf("%ls\n", b);

    printf("end\n");
}

//输出

  

开始

     

984567

     

3 个答案:

答案 0 :(得分:3)

snprintf用于写入char个缓冲区。要写入wchar_t缓冲区,您需要swprintf

答案 1 :(得分:1)

对于数组T arr[10]sizeof arr返回数组占用的字节数(即。sizeof(T) * 10在这种情况下。)但是,swprintf期望数量为wchar_t目标缓冲区中的sizeof a作为其第二个参数。

  

swprintf()函数应在从* ws开始的连续宽字符中放置输出后跟空宽字符;不得写入n个宽字符,包括一个终止的空宽字符,它总是被添加(除非n为零)。

以下测试代码显示了当您使用wchar_t并且源wchar_t字符串长于目标#include <wchar.h> #include <stdio.h> #define ARRLEN(a) (sizeof(a) / sizeof(a[0])) int main() { struct S { int i; wchar_t a[4]; int j, k, l; }; struct S x = {}, y = {}; wchar_t b[] = L"984567"; int rcx, rcy; printf("Start\n"); printf("%ld %ld\n", sizeof(x.a), sizeof(x.a[0])); rcx = swprintf(x.a, ARRLEN(x.a), L"%ls", b); rcy = swprintf(y.a, sizeof(y.a), L"%ls", b); printf("%#x %ls %#x %#x %#x %d\n", x.i, x.a, x.j, x.k, x.l, rcx); printf("%#x %ls %#x %#x %#x %d\n", y.i, y.a, y.j, y.k, y.l, rcy); printf("%ls\n", b); printf("end\n"); return 0; } 缓冲区时,如何销毁金丝雀值。

{{1}}

答案 2 :(得分:0)

使用swprintf

#include <wchar.h>
#include <stdio.h>

int main()
{
    wchar_t a[ 10 ], b[] = L"984567";

    swprintf( a, sizeof( a ), L"%ls", b );

    printf("%ls\n", a);
}

输出:984567