宽字符链接库函数会出现错误

我们都知道如何获得字符串的长度。例如,如果我们已经像下面这样定义了一个字符串指针:
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类型的指标,但它现在却接收了一个
unsigned short类型的指标。您仍然可编译并执行该程序,但您会发现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函数正试图得到一个字符串的长度,并把第1个字节作为字符开始计数,但接着假定如果
下一个字节是0,则表示字符串结束。这个小练习清楚地说明了C语言本身和执行时期链接库函数之间
的区别。编译器将字符串L"Hello!" 解释为一组16位短整数型态数据,并将其保存在wchar_t数组中。
编译器还处理数组索引和sizeof操作符,因此这些都能正常工作,但在连结时才添加执行时期链接库
函数,例如strlen。这些函数认为字符串由单字节字符组成。遇到宽字符串时,函数就不像我们所希
望那样执行了。strlen函数的宽字符版是wcslen(wide-character string length:宽字符串长度),
并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有说明。strlen函数说明如下:
size_t __cdecl strlen (const char *) ;
而wcslen函数则说明如下:
size_t __cdecl wcslen (const wchar_t *) ; iLength = wcslen (pw) ;
函数将返回字符串中的字符数6。请记住,改成宽字节后,字符串的字符长度不改变,只是位组长度改变了。
您熟悉的所有带有字符串参数的C执行时期链接库函数都有宽字符版。例如,wprintf是printf的宽字符版。
这些函数在WCHAR.H和含有标准函数说明的表头文件中说明。

你可能感兴趣的:(c,function,String,语言,编译器,Types)