1

我正在学习如何使用 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

结尾

4

3 回答 3

3

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

于 2014-01-19T23:06:04.480 回答
1

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

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

下面的测试代码显示了当您简单地使用sizeof a并且源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;
}
于 2014-01-20T00:03:06.770 回答
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

于 2014-01-19T23:09:49.197 回答