第6章 标准C++与字符串_第1页
第6章 标准C++与字符串_第2页
第6章 标准C++与字符串_第3页
第6章 标准C++与字符串_第4页
第6章 标准C++与字符串_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章标准C++与字符串

C++是目前世界上最流行的高级程序设计语言之一,它是C语言的扩展,是一种同时具

有面向过程、面向对象和泛型编程特性的混合型程序设计语言。

本章主要介绍在C和C++的标准中所增加的一些新特性和新功能,同时随便介绍一下

标准C++、MFC和.NET框架中的字符串类。

6.1C与C++

C语言是C++的子集,C++是C语言的超集。C++是在C语言的基础匕添加了面向对

象和泛型编程的功能后,扩展而成的。

1.C语言

C语言是一种可移植的系统语言,起源于Unix操作系统的开发。C语言是一种灵活高

效的高级程序设计语言,但是同时也具有一些面向机器的低级语言特征,所以有人称它是一

种中级语言。

1)起源

虽然早在1957年4月IBM(JohnW.Bacus)就推

出了第一个高级程序设计语言FORTRAN(FORmula

TRANslation公式转换),1958年GAMM/ACM(JohnW.

Backus>PeterNaur、C.A.R.Hoare)又推出了ALGOL

(ALGOrithmicLanguage算法语言)。但它们都是为数

学和科学计算设计的,不适合于系统编程。

1964年JohnKemeny和ThomasKurtz简化Fortran

发明了BASIC(BeginnersAll-purposeSymbolic

NiklausWirth

InstructionCodeBASIC初学者通用指令码)语言,1970

年瑞士计算机科学家NiklausWirth又在ALGOL68的基础上创造了Pascal语言。前者是为

专入门的文科学生设计的,简单易学,至今仍然是业余爱好者的宠物;后者则是结构化程序

设计语言的典范、结构优美,曾被广泛用于计算机教学;但是,它们的功能有限、灵活性不

够、效率也不高,也都不适合于编写系统编程。

附注:1991年和2002年微软公司的AlanCooper和PaulVick分别开发出VisualBasic和Visual

Basic.NET。1983年Borland公司的AndersHejlsberg和PhilippeKahn开发出TurboPascal>1985年Niklaus

Wirth和苹果公司的LarryTesler乂创造了ObjectPascal1995年Borland公司的AndersHejlsberg等人在其

基础上开发出Delphi1,

1970年,AT&T贝尔实验室的KenThompson和DennisRitchie等人在DEC公司的PDP-7

小型机上开发出了Unix操作系统,最初的实现是用汇编语言写成的。为了使Unix操作系统

具有可移植性,迫切需要一种高级语

言工具。为此,(出生在美国纽约的计

算机科学家)DennisRitchie以B语言

为基础,参考了Algol68,于1972年

设计出了C语言。1973年他们用C语

言重写了Unix,1975年又利用C语言

将Unix移植到了PDP-11上。

2)特点

KenThompson(左)与DennisRitchie(右)

C语言是一种可移植的系统语

言,拥有充分的控制语句和数据结构功能,包含丰富的操作符,从而能够提供强大的表达能

力,可以用于许多不同的应用领域。但是,c语言并不是面向科学家和计算机业余爱好者的,

而是专门为程序员设计的。

为了进行高效的系统编程,c语言提供了强大的功能和极大的灵活性。与其它高级语言

相比,C语言的语法简洁、表达自由、库函数丰富。如果将编程比作造房子,则Fortran和

Basic等语言就像一些已经预先造好的大预制件,使用起来简单快捷,但是灵活性差、且功

能有限,只能造某些固定模式的房屋;而C语言就像一块块的小砖,使用起来虽然繁琐,

但是灵活性强、而且功能无限,能够造各式各样的建筑物,不过这就要求C语言程序员具

有很高的专业水平。

因此,c语言假设使用者都是计算机专家,采取的是程序员负责制。它不进行完备的类

型检查,对数组越界也没有限制。为了进行高效的系统编程,C语言还提供了指针和指针运

算,程序员可以随意操作全部内存,任意修改任何内容。

表达的自由性和操作的任意性,也给C语言带来了很多编程问题和安全隐患。特别是C

语言的++/-运算符和指针运算,更是倍受指责。

与其它高级语言相比,C语言提供了一些低级语言特征,更面向机器。所以,也有人称

C语言是介于高级语言和低级语言之间的一种中级语言。

3)K&RC

开始的很多年,C语言没有国际标准,只有一个事实标准K&RC。直到1989年和1990

年,才分别推出了ANSIC和ISOC(C89或C90);1999年ISO又推出了第2版(C99)。

不像Algol、COBOL和Ada等语言,C语言并不是政府部门或国际组织的产物,而属

于个人的作品。虽然由于C语言性能优越,使用得越来越广泛,但是在最初的十几年间,C

语言唯一的“标准”是1978年BrianKemighan和DennisRitchie编写的《C程序设计语言》

(TheCProgrammingLanguage),书,通常称其为K&RC或经典C。

该书的附录“C参考手册"(CReferenceManual)成为了C语言的实现指南,但是书中

缺少对库函数标准的描述,一般以Unix实现的库函数所为事实标准。

说明:因为C语言的语法成分简单,很多基本功能(例如I/O语句)都是靠库函数来实

现的。所以,C语言比其它高级语言更依赖于库函数。

4)C89/C90标准

1983年ANSI(AmericanNationalStandardsInstitute美国国家标准协会)设立了一个

X3J11小组,着手进行C语言的标准化。并最终于1989年推出ANSIC(ANSIX3.159-1989),

1990年它又成为国际标准ISOC(ISO/IEC9899:1990Programminglanguages-C,程序设计

语言——C),原来叫做ANSIC或ISOC,现在通常称其为C89或C90。

标准的指导原则是:

•相信程序员;

•不妨碍程序员做需要完成的事情;

•让语言保持短小简单;

•只提供一种方法来执行一种操作;

•使程序运行速度快,即使不能保证其可移植性。(不追求定义的抽象统一,更优先考

虑运行效率)

这些其实也正是C语言的设计初衷,所以ANSI/ISO的C标准,对原始的C语言修改

并不多。标准C对K&RC的主要改变是,增加了函数原型(prototype),强调对函数的输

入参数进行严格的类型检查;并补充定义了C语言的标准函数库。

函数原型的类型检查是指:在编译时,对调用函数的实参和函数定义时的形参的类型是

否一致,进行严格的检查。目的是减少程序纠错的难度(这类问题在运行时很难查出),同

时保证运行的安全和稳定性(避免函数调用栈溢出)。(这也为实现C++函数的参数型多态性

提供了条件。)

例如:

♦K&RC:(过时的)

power();//函数的前向声明

power(x,n)〃函数定义

intx,n;

)

intp=power(3)*power(3.9,5.4);〃使用(编译可通过,运行时产生逻辑错误)

♦C89/C90:(推荐的)

intpower(intx,intn);//函数声明1(函数原型)

intpower(int,int);//函数声明2(函数原型)

intpower(intx,intn)〃函数定义

intp=power©)*power(3.9,5.4);〃使用(编译不能通过,错误:第1个调用

//的参数太少、警告:第2个调用的参数自动转换为(3,5))

•C89/C90对K&RC的其它改变有:

■删除了关键字:entry(条目/入口)

■增加了关键字:const(常型变量)、enum(枚举类型)、signed(有符号的,例

如signedchar)、void(空/无,可用于函数返回值和形参、通用指针类型)、volatile

(易变变量,防止编译器错误的优化)

■传递结构:允许将结构本身作为参数传递给函数(原来只允许传地址)

■函数原型:增加了函数原型(便于编译器进行类型检查)

■增加了预处理指令:#elif(elseif)、#error(错误,强制编译停止)、#line(修

改当前行号和源文件名)、#pragma(附注/编译指令,编译器定义的与实现有

关的指令)

■定义了固有宏:_LINE_(当前行号)、_FILE_(源文件名)、_DATE_

(当前系统日期)、_TIME_(当前系统时间)、_STDC_(标准C版时为1)

5)C99标准

对C90的修订工作开始于1994年,在ISOC++(1998)标准推出之后,ISO又于1999

年12月1611,推出了C语言标准的第2版:ISO/IEC9899:1999Programminglanguages-C

(程序设计语言一C),一般称其为C99。

(1)修订目标

C99保持了C语言的本质特性,C继续是一种短小、清晰和高效的语言。C99并没有增

加新的本质特性,但是为了满足新的需要,也进行很多小的修订。

•C99主要的修订目标有三点:

■支持国际化编程,引入了支持国际字符集Unicode的数据类型和库函数;

■修正原有版本的明显缺点。如整数的移植方法,例如int8_t>intl6_t>int32_t

和int64_t等类型;

■针对科学和工程的需要,改进计算的实用性。例如添加了复数类型和新数学函

数。

(2)具体修改

•C99对C89/C90的具体修改有:

■增加了C++的//注释风格:原来C语言之支持多行注释:/*……*/,C99现在

也识别单行注释:〃……

■增加了关键字:inlineC内联函数)、restrict(限制)、_Bool(布尔类型)、.Complex

(复数)、.Imaginary(虚数)

♦内联函数(inline):链接时不是进行函数调用而是嵌入函数体代码(可减

少调用的时间开销,适用于要求运行速度快的小型函数)

♦restrict:只能用于指针,表明该指针是数据对象的唯一且初始的方式(不

是通过指针的赋值运算另外来得的),便于编译器进行代码优化。

附注:微软公司VC扩展的restrict,是让编译器限制别名(如用typedef

定义的)的使用,必须类型名完全一致(只是类型等价还不够)时,类型

检验才能通过

♦_Bool:布尔类型,为整数类型,一般用1(或非0)表示真、用0表示假。

如果包含了C99新增加的标准库头文件stdbool.h,则可以用bool来代替

_BooL并可使用true和false,从而与标准C++兼容

♦复数和虚数类型:

•如果包含了C99新增加的标准库头文件complex.h后,就可以用

complex来代替.Complex、用imaginary来代替」maginary

•有三种复数和虚数类型:float.Complex、double.Complex、long

double_Complex;float_Imaginarydouble_Imaginary>longdouble

-Imaginary

•在C99内部,是用二元数组来实现复数的,第一个数组元素为实部、

第二个数组元素为虚部

•可以用实数和(定义在complex.h中的)I来初始化一个复变量。例

如:

#include<complex.h>

doublecomplexz=6.0-8.5*I,w=3.0,u=4.0*I;

C99的关键字(Keywords)(共37个)

autoenumrestrictunsigned

breakexternreturnvoid

casefloatshortvolatile

charforsignedwhile

constgotosizeof_Bool

continueifstatic.Complex

defaultinlinestruct」maginary

dointswitch

doublelongtypedef

elseregisterunion

其中:黑色的为K&RC原有的关键字,绿色的为C90添加的关键字,红色的

为C99新增的关键字。(C90删除了K&RC的关键字entry)

■增加了数据类型:(unsigned)longlong[intj(64位整数)(对应的打印输出格

式为%lid或%llu)

■定义了可移植整数类型:因为同一整数类型,在不同字长的计算机系统中,可

能位数不一样,这给移植带来了问题。因此,C99在新增加的头文件inttypes.h

中定义了已有整数类型的一些别名,便于程序移植。例如:int8」、intl6_t、

int32_t、int64_t>uint8_t、uint16_t>uint32_t、uint64_t;intptr」、uintptr」。以

及表示对应类型常量的方法,例如INT8_C(128)、INT32_C(1234)o

■增加了预定义宏:C99新加了两个预定义宏:_STDC_HOSTED_(是本机环

境时为1,否则为0)和_STDC_VERSION_(=199901L时为C99,否则为

C89/C90)

■提供了一个预定义标识符:_func_,为一个代表函数名的字符串(该函数中

包含有此标识符),该标识符具有函数作用域。(宏具有文件作用域)

■增加了浮点常量的十六进制格式:p或P表示后跟二进制指数(的十进制值)。

例如:Oxa.lcplO=(10+1/16+12/256)*210=10352.0

■增加了浮点数的十六进制打印格式符:%a或%A(代替十进制的%e

或%E)、%La或%LA(代替十进制的%Le或%LE)

■可指定初始化的条目:在对数组和结构进行初始化时,原来必须从头到尾顺序

指定初值,最多只能省掉对尾部部分赋初值(未被初始化的条目全被置为0)。

C99可以用用=丫的方法,在花括号中为指定条目i赋初值V。例如:

inta[6]={[5]=123);//最后一个数组元素的初值为123,其余的值全为0

intdays[12]={31,28,[4]=31,30,31,[1]=29};//则初值序列为312900

//31303100000

■支持变长数组(VLA=Variable-Lengtharray):原来的C语言(包括C++)要

求数组定义中的大小必须是整数常量[表达式],而C99允许使用变量。例如:

#defineSIZE12

intm,n;

intal[5],a2{S!ZE};//C89可以

floata3[n],a4[m][n];//C89不允许,C99可以

注意:这里的变长,不是说数组的大小可以随意改变;而是指在定义时,数组

的大小可以是变量。一旦定义完成,数组的大小就已固定,不允许再进行改变。

■复合文字(compoundliteral混合直接量):可以用于定义无名数组、给函数传

递数组和结构常量参数、给其他数组和结构赋初值等。例如:

int*pt=(int口){53,16,88);//定义无名数组

intsum(inta[],intn);//函数原型

inttotal=sum((int[]){4,3,5,2),4);〃给函数传递数组常量参数

structbook{//定义结构

chartutle[41];

charauthor[31];

floatprice;

);

structbookbk;//定义结构变量

bk=(structbook){“CProgramming”,"DennisRitchie”,9.8);//给结构赋初值

■允许在代码块的任何地方定义变量:原来C语言的块变量定义,必须位于块

的开始处(在任何可执行代码之前)。C99允许在代码块的任何地方(包括控

制语句部分)定义变量(-C++),例如:for(inti=0;i<10;i++){……}

■旧关键字的新位置:C99允许将类型限定词(如const>volatile>restrict)和

存储限定词(如auto、register、static)放在函数原型和函数头形参的方括号

内。例如:

voidf(int*constal,int*restricta2,doublestatica3[20]);//老风格

voidf(intal[const],inta2[restrict],doublea3[static20]);//新风格

■弹性数组成员(flexiblearraymember):C99允许在结构的最后定义一个大小

可伸缩的弹性数组成员,可以用于结构指针,根据允许情况来动态分配内存。

但是操作就像它本来就有这么多数组元素似的,增加了编程的灵活性和源码的

可读性。例如:

strtuctflex{

intcount;

doubleaverage;

doublescores[];//弹性数组成员

structilex*pf;

pf=malloc(sizeof(structflex)+n*sizeof(double));

pf->count=n;

doublesum=0;

for(inti=0;i<n;i++){

fstrm»pf->scores[i];

sum+=pf->scores[i]

)

pf->average=sum/n;

■编译指令:在C99中定义了如下三个标准编译指令:

#pragmaSTDCFP_CONTRACTon-off-switch//允许或禁止浮点表达式压缩

#pragmaSTDCFENV_ACCESSon-off-switch//通知是否访问浮点环境

#pragmaSTDCCX_LIMITED_RANGEon-off-switch//通知复数是否范围有限

其中的on-off-switch取值为ON、OFF和DEFAULT之一。

■C99还新提供了一Pragma预处理运算符,可以将字符串转换成常规的编译指令。

例如:

_Pragma(4tuse_booltruefalse")

等价于

#pragmause_booltruefalse

(3)新增标准库

•C99的标准库和头文件

■标准头文件:vassert.h>、〈complex.h>><ctype.h>><enno.h>><fenv.h>、vfloat.h>、

<inttypes.h>><iso646.h><limits.h>><locale.h>><math.h>、<setjmp.h>>

<signal.h>、<stdarg.h>、<stdbool.h>、<stddef.h>、<stdint.h>、<stdio.h>、<stdlib.h>、

<string.h>>vtgmath.h〉、<time.h>><wchar.h>><wctype.h>

■新增加的头文件:在上面的标准头文件中,C99新增加的为:<complex.h>>

<fenv.h>><inttypes.h>^<iso646.h>><stdbool.h>N<wchar.h>><wctype.h>o下

面将逐个加以简单介绍

■complex.h:定义了宏complex、imaginary和I,定义了各种数学函数(与不同

数学函数相比,增加的前导字符c表示复数,尾部字符f和1分别表示float

和longdouble类型,没有尾部字符的为double型),例如:

doublecomplexccos(doublecomplexz);

floatcomplexccosf(floatcomplexz);

longdoublecomplexccosl(longdoublecomplexz);

C99中的复数处理函数(省略了f和1版)

原型说明

doublecarg(doublecomplexz);返回z的相位角编角(弧度)

doublecimag(doublecomplexz);返回z的虚部(实数形式)

doublecomplexconj(doublecomplexz);返回Z的共物复数

doublecomplexcproj(doublecomplexz);返回Z在黎曼域上的投影

doublecreal(doublecomplexz);返回Z的实部(实数形式)

注意:该库VC05不支持

■fenv.h:提供对浮点数环境的访问和控制

♦开启/关闭对浮点环境的访问:#pragmaSTDCFENV_ACCESSON/OFF

♦浮点环境类型:fenv」(整个浮点环境)、fexcept」(浮点状态标志的集合)

♦标准的浮点异常和控制宏:

宏表示

FE_DIVBYZERO抛出被0除异常

FE_INEXACT抛出不精确值异常

FE_INVALID抛出非法值异常

异常

FE_OVERFLOW抛出上溢异常

FE_UNDERFLOW抛出下溢异常

FE_ALL_EXCEPT抛出位异常或实现所支持的所有浮点异常

FE_DOWNWARD向下舍入

FE_TONEAREST最近舍入

控制FE_TOWARDZERO趋0舍入

FE_UPWARD向上舍入

FE_DFL_ENV默认环境(constfevn_t*类型)

♦库函数

原型说明

voidfeclearexcept(intexcepts);清除异常excepts

voidfegetexceptflag(fexcept_t

将excepts异常的标志存储到flagp中

*flagp,intexcepts);

voidferaiseexcept(intexcepts);抛出excepts异常

voidfesetexceptflag(constfexcept_t

将异常标志excepts设置为flagp状态

*flagp,intexcepts);

intfetestexcept(intexcepts);返回excepts指定查询状态的标志位

intfegetround(void);返回当前的舍入方向

intfesetround(intround);将舍入方向设为round,成功返回0

voidfegetenv(fenv_t*envp);将当前环境存入envp

将当前环境存入envp,清除浮点状态

intfeholdexcept(fenv_t*envp);

标志,成功返回0

voidfesetenv(constfenv_t*envp);建立envp表示的环境

voidfeupdateenv(constfenv_t建立envp表示的环境,并抛出自动存

*envp);储的浮点异常

注意:该库VC05也不支持

■inttypes.h:C语言中的同整数类型,在不同字长的计算机系统中,可能位数

不一样,这给移植带来了问题。因此,C99在新增加的头文件inttypes.h中定

义了可移植的整数类型。

固定长度类型

类型名printf说明符scanf说明符最小值最大值

int8_tPRId8SCNd8INT8_MININT8.MAX

intl6_tPRIdl6SCNdl6INT16_MININT16_MAX

int32_tPRId32SCNd32INT32_MININT32_MAX

int64_tPRId64SCNd64INT64_MININT64_MAX

uint8_tPRIu8SCNu80UINT8_MAX

uint!6_tPRIul6SCNul60UINT16_MAX

uint32_tPRIu32SCNu320UINT32.MAX

uint64_tPRIu64SCNu640UINT64_MAX

最小长度类型

类型名printf说明符scanf说明符最小值最大值

int_least8_tPRILEASTd8SCNLEASTd8INT_LEAST8_MININT_LEAST8_MAX

int_leastl6_tPRILEASTdl6SCNLEASTdl6INT_LEAST16_MININT_LEAST16_MAX

int_least32_tPRILEASTd32SCNLEASTd32INT_LEAST32_MININT_LEAST32_MAX

int_least64_tPRILEASTd64SCNLEASTd64INT_LEAST64_MININT_LEAST64_MAX

uint_least8_tPRILEASTu8SCNLEASTu80UINT_LEAST8_MAX

uint_leastl6_tPRILEASTul6SCNLEASTul60UINT_LEAST16_MAX

uint_least32_tPRILEASTu32SCNLEASTu320UINT_LEAST32_MAX

uint_least64_tPRILEASTu64SCNLEASTu640UINT_LEAST64_MAX

最快的最小长度类型

类型名printf说明符scanf说明符最小值最大值

int_fast8_tPRIFASTd8SCNFASTd8INT_FAST8_MININT_FAST8_MAX

int_fastl6_tPRIFASTdl6SCNFASTdl6INT_FAST16_MININT_FAST16_MAX

int_fast32_tPRIFASTd32SCNFASTd32INT_FAST32_MININT_FAST32_MAX

int_fast64_tPRIFASTd64SCNFASTd64INT_FAST64_MININT_FAST64_MAX

uint_fast8_tPRIFASTu8SCNFASTu80UINT_FAST8_MAX

uint_fastl6_tPRlFASTul6SCNFASTul60UINT_FAST16_MAX

uint_fast32_tPRIFASTu32SCNFASTu320UINT_FAST32_MAX

uint_fast64_tPRIFASTu64SCNFASTu640UINT_FAST64_MAX

最大长度类型

类型名printf说明符scanf说明符最小值最大值

intmax_tPRIdMAXSCNdMAXINTMAX_MININTMAX_MAX

uintmax_tPRIuMAXSCNuMAX0UINTMAX_MAX

可保存指针值的整数类型

类型名printf说明符scanf说明符最小值最大值

intptr_tPRIdPTRSCNdPTRINTPTR_MININTPTR_MAX

uintptr_tPRIuPTRSCNuPTR0UINTPTR_MAX

注意:该库VC05也不支持。但是微软在VC中定义了扩展的C++关键字:

_int8、_intl6>_int32和_int64;在WindowsAPI定义了INT32、INT64、

UINT32和UINT64等数据类型;在.NET框架也定义了Intl6、型t32、Nt64、

UIntl6>UInt32和UInt64等结构类型。

■iso646.h:定义了运算符的替代字符串

宏andand_eqbitandbitorcomplnotnot_eqoror_eqxorxor_eq

AA-

运算符&&&=&1〜!!=II1=

注意:该C库VC05支持

■stdbool.h:定义了bool(_Bool)>false(0)和true(1)等宏。

注意:该C库VC05也不支持。但是C++标准支持,它们都是C++的关键字。

■wchar.h:定义了扩展的多字节字符和宽字符工具:(参见wchar.doc,该C库

VC05支持)

♦数据类型:

•wchar_t:可表示本地环境所支持的最大扩展字符集的一种整数类型,

在YC05中定义为unsignedshort(2B)

•wint_t:可表示最大扩展字符集任何值以及其他值的一种整数类型,

在VC05中定义为int(4B)

•size_t:由sizeof返回的整数值类型,在VC05中定义为unsignedint

(4B)(在Win64中定义为unsigned_int64)

•mbstate-t:为一种非数组的对象类型,用于保存多字节字符与宽字符

之间转换所需状态信.息。在VC05中定义为int(4B)

•structtm:用来保存日历时间成分的结构类型,至少应该包含下列成

员:

inttm_sec;//secondsaftertheminute—[0,60]

int//minutesafterthehour一[0,59]

inttm_hour;//hourssincemidnight一10,23]

inttm_mday;//dayofthemonth一[1,31]

inttm_mon;//monthssinceJanuary一[0,HJ

inttm_year;//yearssince1900

inttm_wday;//dayssinceSunday—[0,6]

inttm_yday;//dayssinceJanuary1一[0,365]

inttm_isdst;//DaylightSavingTimeflag

在VC05中定义也为:

structtm{

inttm_sec;/*secondsaftertheminute-[0,59]*/

inttm_min;/*minutesafterthehour-[0,59]*/

inttm_hour;/*hourssincemidnight-[0,23]*/

inttm_mday;/*dayofthemonth-[1,31]*/

inttm_mon;/*monthssinceJanuary-[0,11]*/

inttm_year;/*yearssince1900*/

inttm_wday;/*dayssinceSunday-[0,6]*/

inttm_yday;/*dayssinceJanuary1-[0,365]*/

inttm_isdst;/*daylightsavingstimefiag*/

);

♦符号常量宏:

•NULL(空指针,丫05中定义为(n(^*)0))

•WCHAR.MAX(wchajt的最大值,VC中定义为0xFFFF[65535])

•WCHAR_MIN(wchar」的最小值,VC05中定义为0)

•WEOF(宽字符文件的结尾,是EOF的宽字符表示,在VC05中定

义为(wint_t)(0xFFFF)[65535])

♦宽字符I/O函数:

•I/O函数:(字符和串格式符从%C和%5改为%lc和%人)

intfwprintf(FILE*stream,constwchar_t*format,...);

intfwscanf(FILE*stream,constwchar_t*format,...);

intswprintf(wchar_t*s,size_tn,constwchar_t*format,...);

intswscanf(constwchar_t*s,constwchar_t*format,...);

intvfwprintf(FILE*stream,constwchar_t*format,va_listarg);

intvfwscanf(FILE*stream,constwchar_t*format,va_listarg);

intvswprintf(wchar_t*s,size_tn,constwchar_t*format,va_listarg);

intvswscanf(constwchar_t*s,constwchar_t*format,va_listarg);

intvwprintf(constwchar_t*format,va_listarg);

intvwscanf(FILE*stream,constwchar_t*format,va_listarg);

intwprintf(constwchar_t*format,...);

intwscanf(constwchar_t*format,...);

wint_tfgetwc(FILE*stream);

wchar_t*fgetws(wchar_t*s,intn,FILE*stream);

wint_tfputwc(wchar_tc,FILE*stream);

intfputws(constwchar_t*s,FILE*stream);

intfwide(FILE*stream,intmode);

wint_tgetwc(FILE*stream);

wint_tgetwchar(void);

wint_tputwc(wchar_tc,FILE*stream);

wint_tputwchar(wchar_tc);

wint_tungetwc(wint_tc,FILE*stream);

•字符串工具:

doublewcstod(constwchar_t*nptr,wchar_t**endptr);

floatwcstof(constwchar_t*nptr,wchar_t**endptr);

longdoublewcstold(constwchar_t*nptr,wchar_t**endptr);

longintwcstol(constwchar_t*nptr,wchar_t**endptr,intbase);

longlongintwcstoll(constwchar_t*nptr,wchar_t**endptr,intbase);

unsignedlongintwcstoul(constwchar_t*nptr,wchar_t**endptr,intbase);

unsignedlonglongintwcstoull(constwchar_t*nptr,wchar_t**endptr,intbase);

wchar_t*wcscpy(wchar_t*si,constwchar_t*s2);

wchar_t*wcsncpy(wchar_t*si,constwchar_t*s2,size_tn);

wchar_t*wcscat(wchar_t*s1,constwchar_t*s2);

wchar_t*wcsncat(wchar_t*si,constwchar_t*s2,size_tn);

intwcscmp(constwchar_t*sl,constwchar_t*s2);

intwcscoll(constwchar_t*sl,constwchar_t*s2);

intwcsncmp(constwchar_t*sl,constwchar_t*s2,size_tn);

size_twcsxfrm(wchar_t*si,constwchar_t*s2,size_tn);

wchar_t*wcschr(constwchar_t*s,wchar_tc);

size_twcscspn(constwchar_t*sl,constwchar_t*s2);

size_twcslen(constwchar_t*s);

wchar_t*wcspbrk(constwchar_t*sl,constwchar_t*s2);

wchar_t*wcsrchr(constwchar_t*s,wchar_tc);

size_twcsspn(constwchar_t*sl,constwchar_t*s2);

wchar_t*wcsstr(constwchar_t*sl,constwchar_t*s2);

wchar_t*wcstok(wchar_t*si,constwchar_t*s2,wchar_t**ptr);

wchar_t*wmemchr(constwchar_t*s,wchar_tc,size_tn);

intwmemcmp(wchar_t*si,constwchar_t*s2,size_tn);

wchar_t*wmemcpy(wchar_t*si,constwchar_t*s2,size_tn);

wchar_t*wmemmove(wchar_t*sl,constwchar_t*s2,size_tn);

wchar_t*wmemset(wchar_t*s,wchar_tc,size_tn);

size_twcsftime(wchar_t*s,size_tmaxsize,constwchar_t/format,const

structtm*timeptr);

size_twcsfxtime(wchar_t*s,size_tmaxsize,constwchar_t*format,const

structtmx*timeplr);

•转换函数:

wint_tbtowc(intc);

intwctob(wint_tc);

intmbsinit(constmbstate_t*ps);

size_tnibrlen(constchar*s,size_tn,mbstate_t*ps);

size_tmbrtowc(wchar_t*pwc,constchar*s,size_tn,mbstate_t*ps);

size」wcrtomb(char*s,wchar_twc,mbstate_t*ps);

size_tmbsrtowcs(wchar_t*dst,constchar**src,size」len,mbstate_t*ps);

size_twcsrtombs(char*dst,constwchar_t**src,size_tlen,mbstate_t*ps);

■wctype.h:提供与ctype.h类似的宽字符函数。(也参见wchar.doc,该C库VC05

也支持)

♦类型:

•wint_t:可保存扩展字符值的一种整数类型,VC05中定义为unsigned

short(2B)

•wctrans.t:表示特定字符映射的一种标量类型,VC05中定义为

wchar_t(2B)

•wctype_t:表示字符分类的一种标量类型,VC05中也定义为unsigned

short(2B)

♦符号常量宏:

•WEOF:宽字符输入的文件结尾,VC05中定义为(wint_t)(OxFFFF)

[65535]

♦函数:

•分类函数:

intiswalnum(wint_twc);

intiswalpha(wint_twc);

intiswcntrl(wint_twc);

intiswdigit(wint_twc);

intiswgraph(wint_twc);

intiswlower(wint_twc);

intiswprint(wint_twc);

intiswpunct(wint_twc);

intiswspace(wint_twc);

intiswupper(wint_twc);

intiswxdigit(wint_twc);

•可扩展分类函数:

intiswctype(wint_twc,wctype_tdesc);

wctype_twctype(constchar*property);

•转换函数:

wint_ttowlower(wint_twc);

wint_ttowupper(wint_twc);

wint_ttowctrans(wint_twc,wctrans_tdesc);

wctrans_twctrans(constchar"property);

(4)数学改进

除了上面以及讲过的新增关键字.Complex(复数)和」maginary(虚数)、float和long

double版的数学函数、以及复数运算的标准库外。C99对数学库也进行了许多修改,增加了

两个数据类型,并添加了大量新的数学函数。

•math.h:除了上面这些新增加的库和头文件外,为了支持IEC60559:1989(Binary

floating-pointarithmeticformicroprocessorsystems微处理器系统的二进制浮点运

算)浮点运算标准,C99还对数学库进行了如下扩展:

■float」和double」类型:是C99新增加的分别进行float和double运算最快的

的类型。(位数:double」》float」、float」Afloat、double_t》double)

■float和longdouble版函数:原来的很多数学函数只有double版

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论