文档章节

C语言中的宽字符

ifeixiang
 ifeixiang
发布于 2014/10/31 17:48
字数 787
阅读 22
收藏 0

宽字符库函数 我们都知道如何找出一个字符串的长度。例如,如果我们定义了一个指向字符串的指针:

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库函数。只有那些有字符串参数的。而且你并不需要重写它们,因为重写已经完成了。 宽字符版本的strlen函数被称为wcslen("宽字符字符串长度"),并定义在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和定义正常函数的头文件中。

© 著作权归作者所有

ifeixiang
粉丝 16
博文 270
码字总数 99506
作品 0
广州
程序员
私信 提问
C语言scanf函数详细解释

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类...

晨曦之光
2012/03/09
47K
1
python模块介绍- binascii 二进制和ASCII转换

简介 binascii模块包含很多用来方法来转换二进制和各种ASCII编码的二进制表示法。通常不直接使用这些功能,而是使用封装模块,如uu, base64或binhex。binascii模块包含用C语言编写更快的低级...

长平狐
2013/12/25
1K
0
操作系统标准接口设计POSIX

POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行...

jackliu16
2018/04/23
0
0
C语言编程之C语言知识要点,非常基础且非常实用的编程知识点

每天持续分享c语言,C++等方面的编程,如果你也喜欢编程,你也热爱编程,欢迎您关注我们,,一起交流一起进步。 C语言 字符 A字符数据的合法形式:: '1' 是字符占一个字节,"1"是字符串占两个...

小辰GG
2017/11/25
0
0
MVC开始模块化编程(下)未完。。

我们继续利用上一篇,参考MVC开始模块化编程(中)对VIEW的方法,我们也对control模块的接口进行设计,并修改attr.c文件。如下: attr.c control.c 新增文件 control.h 保存上述文件,然后 ...

中山野鬼
2012/10/26
3.3K
15

没有更多内容

加载失败,请刷新页面

加载更多

以太坊中文文档翻译-区块

本文原文链接 点击这里获取Etherscan API 中文文档(完整版) 完整内容排版更好,推荐读者前往阅读。 区块(Blocks) 区块相关的 API,接口的参数说明请参考Etherscan API 约定, 文档中不单独...

Tiny熊
32分钟前
1
0
Linux 内核的一个问题

是virtio 驱动,但是没有启动 virtio-mmio virtio-mmio.0: Failed to enable 64-bit or 32-bit DMA. Trying to continue, but this might not work.....[ 1.047924] md: ... autorun......

MtrS
56分钟前
2
0
MySQL主从配置

17.1 MySQL主从介绍 17.2 准备工作 17.3 配置主 17.4 配置从 17.5 测试主从同步 一、 MySQL主从介绍

tobej
今天
2
0
读书replay《博弈与社会》.1.20190526

前情 《美丽心灵》,一部讲数学家约翰·福布斯·纳什的电影,我第一次听到博弈理论就是在这部电影里。看过电影之后就一直想知道,博弈论究竟讲了什么。很久之后,20190417这天,我刷JD的购物...

wanxiangming
今天
2
0
iOS TableView层级结构剖析

首先上图 下面来分析一下tableView的层级结构 tableView的组成: 1.整个tableView有且仅有一个头部和尾部就是tableViewHeadView和tableViewFooterView2.tableView 可以有多个section,一个s...

HOrange
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部