C语⾔中的宽字符
宽字符库函数我们都知道如何出⼀个字符串的长度。例如,如果我们定义了⼀个指向字符串的指针:
char * pc = "Hello!";
我们可以调⽤
iLength = strlen(pc);
变量iLength会被设成6,也就是字符串中字符的个数。好极了!现在让我们尝试定义⼀个指向宽字符串的指针:
wchar_t * pw = L"Hello!";
⽽且现在我们再次调⽤strlen:
iLength = strlen(pw);
现在问题出现了。⾸先,C编译器会给你⼀个警告消息,⼤概是下⾯这个意思:
'function' : incompatible types - from
'unsigned short *' to 'const char *'
这是在告诉你strlen函数被定义为接受⼀个指向char的指针,但这⾥收到的是⼀个指向⽆符号短整型的指针。仍然可以编译运⾏程序,但你会发现iLength变成了1。发⽣了什么呢?字符串"Hello!"中的6个字符包含的16位值如下:
0x0048 0x0065 0x006C 0x006C 0x006F 0x0021
这些值被Intel处理器以下⾯这种⽅式存储在内存中:
48 00 65 00 6C 00 6C 00 6F 00 21 00
strlen函数,假设它试图到字符串的长度,计算第⼀个字节为字符,但然后会认为第⼆字节是⼀个表明字符串结尾的零字节。这个⼩⼩的实验清楚地表明了C语⾔⾃⾝和运⾏库函数的细微差别。编译器将字符串L"Hello! "解释为⼀个16位短整型的集合并把它们存储在wchar_t数组。编译器还会处理所有数组索引和sizeof操作符,因此这些都会正常⼯作。但是,程序运⾏时,运⾏库函数(如strlen)是在链接时被增加进去的。这些函数期望收到由单字节字符构成的字符串。因此在遇到宽字符串时,它们不会像我们预期那样执⾏。你说,哦,太倒霉了,现在每⼀个C库函数都要被重写,以接受宽字符。嗯,并⾮每⼀个C库函数。只有那些有字符串参数的。⽽且你并不需要重写它们,因为重写已经完成了。宽字符版本的strl
en函数被称为wcslen("宽字符字符串长度"),并定义在STRING.H(也就是strlen被定义的地⽅)和WCHAR.H中。strlen函数的声明如下:
size_t __cdecl strlen(const char*);
⽽wcslen函数的声明如下:
size_t __cdecl wcslen(const wchar_t*);
所以现在我们知道了⼀点:在需要确定⼀个宽字符串的长度时,我们可以调⽤以下函数:
c语言库函数
iLength = wcslen(pw);
该函数返回的结果是6,也就是字符串中的字符个数。
请记住,在使⽤宽字符的时候,字符串的字符长度并没有改变,改变的只是字节长度。
所有你喜爱的C语⾔中那些使⽤字符串参数的运⾏库函数都有宽字符的版本。
例如,wprintf是宽字符版本的printf。这些函数都被定义在WCHAR.H和定义正常函数的头⽂件中。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。