strlen 函数原型如下:
size_t __cdecl strlen(const char *);
是计算'\0'结束的字符串的长度。
#include <stdio.h>
int main()
{
wchar_t wstr[] = L"Hello!";
char str[] = "Hello!";
int wlen = strlen(wstr);
int len = strlen(str);
printf("wlen=%d\n",wlen);
printf("len=%d\n",len);
return 0;
}
len=6,而wlen=1. wstr占6个字节啊,为什么输出1?wstr的编码为宽字符内存中编码
48 00 65 00 6C 00 6C 00 6F 00 21 00
由于strlen计算从字符串首地址到‘\0’之间的字符个数,宽字符后一位为0(也就是‘\0’)所以输出长度为1
wsclen 函数原型如下
size_t __cdecl wcslen(const wchar_t *);
计算宽字符串的长度,宽字符的'\0'(两个字节的00 00)
#include <stdio.h>
int main()
{
wchar_t wstr[] = L"Hello!";
char str[] = "Hello!";
int wlen = wcslen(wstr);
int len = wcslen(str);
printf("wlen=%d\n",wlen);
printf("len=%d\n",len);
return 0;
}
wlen = 6,而len =10,为什么会输出10?str在内存中的编码
从上图中看出从‘H’到 00 00 一共20个字节所以len = 10。而且这个值的大小与str的长度无关。
printf与wprintf、%s与%ls的关系如下表
printf | 指输出流是字符类型 |
wrpintf | 指输出流是宽字符类型 |
%s | 指参数变量类型以字符截断 |
%ls | 指参数类型以宽字符截断 |