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