关于获取字符串的长度
来源:互联网 发布:软件接口设计 编辑:程序博客网 时间:2024/06/10 17:36
原文:http://blog.csdn.net/space_v/article/details/303418
我们都知道如何获得字串的长度。例如,如果我们已经像下面这样定义了一个字串指标:
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。这些函式认为字串由单位元组字元组成。遇到宽字串时,函式就不像我们所希望那样执行了。
您可能要说:「噢,太麻烦了!」现在每个C语言程式库函式都必须重写以接受宽字元。但事实上并不是每个C语言程式库函式都需要重写,只是那些有字串参数的函式才需要重写,而且也不用由您来完成。它们已经重写完了。
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#获取字符串的长度
- 获取字符串的真实长度
- C#获取字符串的长度
- 获取字符串的像素长度
- android获取字符串的长度
- C#获取字符串的长度
- 获取文本字符串的长度
- php:获取字符串的长度
- 获取字符串的像素长度
- 关于字符串长度的截取
- 【关于String的Demo_01】获取带有汉字的字符串的长度,汉字为2位
- [My]Ecplise中控制台视图和服务器视图中停止Web服务器的差别
- WindowsPhone7.5芒果Logo改头换面
- 将程序内存中的某一地址的固定长度的数据取出来放到TXT中
- 一起学Windows Phone7开发系列课程【微软官方MSDN链接汇总】
- 自动备份网站文件和数据库上传到FTP空间
- 关于获取字符串的长度
- tomcat+myeclipse做jsp时找不到包的问题
- Poechant 练习 Java API - Y/N 输入验证
- 使用 CSS3 可以实现的五种很酷很炫的效果
- 关于开发 可以多想,但前期一定不要多做
- Android模拟器中各种屏幕分辨率
- HTTP POSTs and HTTP GETs with WebClient
- Oracle and Direct I/O
- java io 流原理