启发是什么意思语解释例句-海词汉语-环球职业教育在线网


2023年4月7日发(作者:有道英语翻译器)

TheStandardCLibrary经典的基础

C的标志库函数是学习和使用C语言的基础,是编写经典C程序的基础,是学习其他计算机知

识的基础.C标志库中一共包含了15个头文件:

1:

NDEBUG

NDEBUG宏是调试开关,当使用#includeNDEBUG时程序为非调试状态,这种状态下

调试宏assert不起作用。

assert

调试宏assert只有在程序处于调试状态下才发挥作用,它的使用形式如下:

assert(expression);当条件为假时会在屏幕中输出如下的调试信息:“Assertionfailed:expression,

filexyz,linennn”,其中xyp是assert所在的文件名,nnn为assert在该文件中的位置。

assert宏还有许多用法,请参看《WritingCleanCode》第二章设计并使用断言。

2:

下面的类型,宏,函数都是分类的

其他:

size_tsizeof返回的值

NULL空指针

文件:

FILE文件的类型

fpos_t文件中指针的位置

EOF文件末尾<0

FILENAME_MAX文件名最大值>0

FOPEN_MAX同时打开文件的最大值>8

SEEK_SET文件头

SEEK_CUR文件当前位置

SEEK_END文件末尾

打开文件

FILE*fopen(constchar*filename,constchar*mode);

更改当前流相关的文件

FILE*freopen(constchar*filename,constchar*mode,FILE*stream);

关闭文件

intfclose(FILE*stream);

清除流中的错误标志或文件末尾标志

voidclearerr(FILE*stream);

测试流上的文件末尾标志

intfeof(FILE*stream);

测试流上的错误标志

intferror(FILE*stream);

将一个字符放回到流中

intungetc(intc,FILE*stream);

从流中读一个字符

intfgetc(FILE*stream);

intgetc(FILE*stream);

写一个字符到一个流

intfputc(intc,FILE*stream);

intputc(intc,FILE*stream);

从流中获取一个字符串

char*fgets(char*s,intn,FILE*stream);

写一个字符串到一个流

intfputs(constchar*s,FILE*stream);

打印一个格式化数据到一个流

intfprintf(FILE*stream,constchar*format,...);

使用一个参量列表指针格式化到流的数据

intvfprintf(FILE*stream,constchar*format,va_listap);

从一个流中读取格式化数据

intfscanf(FILE*stream,constchar*format,...);

从一个流中读数据

size_tfread(char*buffer,size_tsize,size_tcount,FILE*stream);

写数据到一个流

intfwrite(constchar*buffer,size_tsize,size_tcount,

FILE*stream);

获取流的文件位置指示符

intfgetpos(FILE*stream,fpos_t*pos);

设置流位置指示符

intfsetpos(FILE*stream,constfpos_t*pos);

移动文件指针到一个指定的位置

intfseek(FILE*stream,longoffset,intorigin);

获得文件指针相对于文件头的偏移量

longftell(FILE*stream);

重新定位一个文件指针到文件开头

voidrewind(FILE*steam);

删除一个文件

intremove(constchar*path);

更改一个文件或目录

intrename(constchar*oldname,constchar*newname);

缓冲区:

_IOFBF

_IOLBF

_IONBF缓冲区类型

BUFSIZE缓冲区尺寸>=256

刷新一个流并清空与流相关的缓冲区的内容

intfflush(FILE*stream);

控制流的缓冲区,已经被setvbuf代替

voidsetbuf(FILE*stream,char*buffer);

控制流的缓冲区类型和缓冲区大小

intsetvbuf(FILE*stream,char*buffer,intmode,size_tsize);

将一个格式化数据写入一个字符串

intsprintf(char*buffer,constchar*format,...);

从字符串中读格式化数据

intsscanf(constchar*buffer,constchar*format,...);

从参量列表指针格式化到字符串

intvsprintf(char*buffer,constchar*format,va_listap);

临时文件

L_tmpnam临时文件名长度>0

TMP_MAX产生唯一文件名的最大数目>=25

以二进制读写的方式建立一个临时文件

FILE*tmpfile(void);

建立一个临时文件名

char*tmpname(char*string);

标准流:

stdin标准输入流

stdout标准输出流

stderr标准错误输出流

从stdin获得一个字符

intgetchar(void);

把字符写道stdout

intputchar(intc);

从stdin中获取一行

char*gets(char*buffer);

写一个字符串到stdout

intputs(constchar*string);

打印一个错误消息到stderr

voidperror(constchar*error);

打印格式化数据到stdout

intprintf(constchar*format,...);

从stdin读格式化数据

intscanf(constchar*format,...);

从参量列表指针格式化到stdout

intvprintf(constchar*format,va_listap);

3:

中定义的函数都是工具类的函数可以分类学习

其他:

NULL

size_t

执行一个系统命令

intsystem(constchar*command);

程序控制:

EXIT_SUCCESS

EXIT_FAILUREexit函数的推出参数

终止当前进程并返回一个错误代码

voidabort(void);

在推出时执行指定的函数

intatexit(void(*func)(void));

终止调用进程

voidexit(intstatus);

数学工具:

div_t函数div的返回类型

ldiv_t函数ldiv的返回类型

RAND_MAXrand函数返回的最大值

产生一个伪随机数

intrand(void);

设置一个随机起始点

voidsrand(unsignedintseed);

计算绝对值

intabs(inti);

计算一个long整数的绝对值

longlabs(longl);

执行一个快速排序

voidqsort(void*base,size_tcount,size_tsize,

int(*compare)(constvoid*elem1,constvoid*elem2));

执行一个排序数组的二叉查找

void*bsearch(constvoid*key,constvoid*base,

size_tcount,size_tsize,

int(*compare)(constvoid*elem1,constvoid*elem2)

);

计算两个数的商与余数

div_tdiv(intnumber,intdenom);

计算两个long整数的商和余数

ldiv_tldiv(longnumber,longdenom);

字符/字符串工具

wchar_t宽字符宽度

MB_CUR_MAX多字节字符中的最大字节数

将字符串转换成双精度

doubleatof(constchar*string);

将字符串转换成整数

intatoi(constchar*string);

将字符串转换成长整形

longatol(constchar*string);

把字符串转换成一个双精度值

doublestrtod(constchar*string,char**endptr);

把字符串转换成长整形

longstrtol(constchar*string,char**endptr,intbase);

把字符串转换成无符号长整形

unsignedlongstrtoul(constchar*string,char**endptr,intbase);

获取长度和确定一个多字节字符的有效性

intmblen(constchar*s,size_tcount);

将一个多字节字符序列转换成宽字符序列

size_tmbstowcs(wchar_t*wcstr,constchar*mbstr,size_tcount));

将一个多字节字符转换成对应的宽字符

intmbtowc(wchar_t*wchar,constchar*mbchar,size_tcount));

将一个宽字符序列转换成一个多字节字符序列

size_twcstombs(char*mbstr,wchar_t*wcstr,size_tcount));

将一个宽字符转换成一个多字节字符

intwctomb(char*mbchar,wchar_twchar);

内存管理工具:

分配内存块

void*malloc(size_tsize);

在内存中分配一个数组并初始化为0

void*calloc(size_tcount,size_tsize);

重新分配内存块

void*recalloc(void*memblock,size_tsize);

释放一块内存

voidfree(void*memblock);

环境工具:

从当前环境中取得一个值

char*getenv(constchar*varname);

4

头文件中定义了有关于字符操作的函数

判断一个字符是否为控制字符(0x00~0x1f或0x7f)

intiscntrl(intc);

判断一个字符是否为空白字符(0x09~0x0d或0x20)

intisspace(intc);

判断一个字符是否为可打印字符(0x20~0x7e)

intisprint(intc);

判断一个字符是否为非空格的其他可打印字符(0x21~0x7e)

intisgraph(intc);

判断一个字符是否为标点字符

intispunct(intc);

判断一个字符是否为字母数字字符

intisalnum(intc);

判断一个字符是否为十进制数字字符

intisdigit(intc);

判断一个字符是否为十六进制数字字符

intisxdigit(intc);

判断一个字符是否为字母字符

intisalpha(intc);

判断一个字符是否为大写字母字符

intisupper(intc);

判断一个字符是否为小写字母字符

intislower(intc);

转换字符为小写

inttolower(intc);

转换字符为大写

inttoupper(intc);

5:

中声明的函数都是关于c字符串和内存操作的函数

其他:

NULL

size_t

内存操作:

查找内存块中的一个字符

void*memchr(constvoid*buffer,intc,size_tcount);

比较两个内存块中的字符

intmemcmp(constvoid*buffer1,constvoid*buffer2,size_tcount);

在在内存块之间拷贝字节

void*memcpy(void*dest,constvoid*src,size_tcount);

移动内存块

void*memmove(void*dest,constvoid*src,size_tcount);

用指定的字符填充内存

void*memset(void*dest,intc,size_tcount);

对于以上的函数中的size_tcount项使用需注意了

当你按如下方式使用是错误的

str=(char*)malloc(sizeof(char)*81);

strp=(char*)memchr(str,‘u’,sizeof(str));

free(str);

这是错误的str是指针它的长度不是整个字符串的长度,所以strp得不到正确的结果

应改为一个确定的数或者是实际数组的长度如strlen(str).

字符串操作:

字符串拼接

char*strcat(char*dest,constchar*src);

向一个字符串末尾添加指定长度的字符串

char*strncat(char*dest,constchar*src,size_tn);

在字符串中查找一个字符

char*strchr(constchar*str,intc);

在一个字符串中查找一个字符最后一次出现

char*strrchr(constchar*str,intc);

比较字符串

intstrcmp(constchar*str1,constchar*str2);

比较两个字符串中指定长度的子串的大小

intstrncmp(constchar*str1,constchar*str2,size_tn);

使用指定场所的信息比较字符串

intstrcoll(constchar*str1,constchar*str2);

基于指定场所转换一个字符串

size_tstrxfrm(char*dest,constchar*src,size_tn);

拷贝一个字符串

char*strcpy(char*dest,constchar*src);

将源字符串中指定长度的子串拷贝到目的串中

char*strncpy(char*dest,constchar*src,size_tn);

查找一个子串

char*strstr(constchar*string,constchar*str);

查找string包含str中包含的字符的长度,例如:

string=“cabbage”;str=“abc”;returnvalue=5;

string=“cabbage”;str=“abc”;returnvalue=3;

string=“cafbbage”;str=“abc”;returnvalue=2;

string=“vcabbage”;str=“abc”;returnvalue=0;

size_tstrspn(constchar*string,constchar*str);

在一个字符串中查找另一字符串的任意字符第一次出现的下标例如

string=“cabbage”;str=“ag”;returnvalue=1;

string=“xcabbage”;str=“ag”;returnvalue=2;

size_tstrcspn(constchar*string,constchar*str);

返回在string中出现str字符集中的第一个字符的位置例如:

string=“kdkowadkfakkei”;str=“aeiw”;

returnvalue=“wadkfakkei”;

char*strpbrk(constchar*string,constchar*str);

查找字符串中下一个语言符号

所谓的语言符号就是指用户定义的表示一个意义的整体,string是字符串,str是包含分割

语言符合的分隔符的集合.使用方法例如:

token=strtok(string,str);

while(token!=NULL)

{

puts(token);

token=strtok(NULL,str);

}

string=“kksniiwojfietwlk,’ksifnli”;

str=“nt,.’”;

结果为:

kks

iiwo

jfie

wlk

diwpob

owf

ksif

li

str=“w”;

结果为:

kksnii

ojfiet

lk,di

pob.o

f’ksifnli

char*strtok(char*string,constchar*str);

通过系统错误编号来获得系统错误消息

char*strerror(interrorcode);

获取字符串有效长度(不包括’0’)

size_tstrlen(constchar*str);

6:

中定义了整形的各种形式的边界值

char

CHAR_BIT一个char占的位数

MB_LEN_MAX多字节中char占的字节数

CHAR_MAX

CHAR_MIN

SCHAR_MAX

SCHAR_MIN

UCHAR_MAX

short

SHRT_MAX

SHRT_MIN

USHRT_MAX

int

7:

NULL

size_t

wchar_t

ptrdiff_t指针之间的差值

size_toffsetof(structName,memberName);结构成员相对于结构的偏移量

INT_MAX

INT_MIN

UINT_MAX

long

LONG_MAX

LONG_MIN

ULONG_MAX

8

NULL

size_t

CLOCKS_PER_SEC每秒的时钟数

CLK_TCK每秒的时钟数被CLOCKS_PER_SEC代替

clock_tclock函数的返回类型表示进程的逝去时钟数

time_ttime等函数的返回值表示日历时间

structtm

{

inttm_sec;秒(0-59)

inttm_min;分钟(0-59)

inttm_hour;小时(0-24)

inttm_mday;月中的天数(多少号)(1-31)

inttm_mon;月份(0-11)

inttm_year;年份从1900年开始

inttm_wday;星期(0-6,星期日=0)

inttm_yday;一年中的日期(0-365,1月1号=0)

inttm_isdst;夏令时(正数有效,0无效,负数未定义)

};

返回调用进程使用的时钟数

clock_tclock(void);

获取系统时间(从1970,1,100:00:00开始到现在的的秒数)

timer可以为NULL表示只返回不存储

time_ttime(time_t*timer);

返回两个时间的差值

doubledifftime(time_ttime1,time_ttime2);

将time_t转换成字符串

char*ctime(consttime_t*timer);

转换一个时间值有time_t转换到structtm

structtm*locattime(consttime_t*timer);

gmtime使用UTC世界时间代码而不是本地时间

structtm*gmtime(consttime_t*timer);

将structtm转换成time_t

time_tmktime(structtm*timer);

localtimegmtimemktime使用同一个structtm静态结构.每次调用前都清除其中的容

将structtm转换成字符串

char*asctime(conststructtm*timer);

格式化一个时间字符串

size_tstrftime(char*dest,size_tsize,constchar*format,

conststructtm*timer);

9:

一样是定义边界值的,定义的是浮点数的边界值

double

DBL_DIGdouble小数点后面精确的位数

DBL_EPSILON小的正数,double的0跨度值

DBL_MANT_DIG尾数中的位数

DBL_MAX最大值

DBL_MAX_10_EXP最大10进制指数

DBL_MAX_EXP最大2进制指数

DBL_MIN最小值

DBL_MIN_10_EXP最小10进制指数

DBL_MIN_EXP最小2进制指数

float

FLT_DIGfloat小数点后面精确的位数

FLT_EPSILON小的正书,float的0跨度值

FLT_MANT_DLG尾数中的位数

FLT_MAX最大值

FLT_MAX_10_EXP最大10进制指数

FLT_MAX_EXP最大2进制指数

FLT_MIN最小值

FLT_MIN_10_EXP最小10进制指数

FLT_MIN_EXP最小2进制指数

FLT_RADIX进制基数

FLT_ROUNDS加法舍入

longdouble

LDBL_DIGlongdouble小数点后面精确的位数

LDBL_EPSILON小的正数,longdouble的0跨度值

LDBL_MANT_DLG尾数中的位数

LDBL_MAX最大值

LDBL_MAX_10_EXP最大10进制指数

LDBL_MAX_EXP最大2进制指数

LDBL_MIN最小值

LDBL_MIN_10_EXP最小10进制指数

LDBL_MIN_EXP最小2进制指数

10

中定义了数学函数

HUGE_VAL最大的可表示的双精度值,这个值是由许多数学函数错误时返回的,有的

函数返回-HUGE_VAL

EDOM当传递的参数类型或数值错误时errno被赋予这个值

ERANGE当数值超出浮点数的范围时errno被赋予这个值

三角函数

计算正弦

doublesin(doublex);

计算双曲线的正弦

doublesinh(doublex);

计算余弦

doublecos(doublex);

计算双曲线余弦

doublecosh(doublex);

计算正切

doubletan(doublex);

计算双曲线正切

doubletanh(doublex);

计算反余弦

doubleacos(doublex);

计算反正弦

doubleasin(doublex);

计算反正切

doubleatan(doublex);

计算y/x的反正切

doubleatan2(doubley,doublex);

幂函数

计算x的y次幂

doublepow(doublex,doubley);

计算平方根

doublesqrt(doublex);

计算指数值

doubleexp(doublex);

计算自然对数

doublelog(doublex);

计算以10为底的对数

doublelog10(doublex);

浮点数操作函数

返回大于或等于x的最小整数

doubleceil(doublex);

计算浮点数的绝对值

doublefabs(doublex);

返回小于等于x的最大整数

doublefloor(doublex);

计算x/y的余数

doublefmod(doublex,doubley);

获得一个浮点数的尾数和指数

doublefrexp(doublex,int*expptr);

从尾数和指数计算一个实数

doubleldexp(doublex,intexp);

把一个浮点数分解成小数和整数

doublemodf(doublex,int*intptr);

11

errno各种错误条件的事件赋予的错误代码如EDOM,ERANGE等

12

一个程序用于指定该程序使用哪一部分场所信息.

NULL

LC_ALL影响所用的方面

LC_COLLATE影响字符串校验函数strcoll,strxfrm

LC_CTYPE影响中定义的字符处理函数

LC_MONETARY影响localeconv返回的钱币格式信息

LC_NUMERIC影响localeconv返回的非钱币格式的使用小数的数字信息,包括格式化,

字符转换等

LC_TIME影响strftime

structlconv

{

成员“C”场所值场所范围成员含义

char*currency_symbol;“”LC_MONETARY当前场所的地方货币

符号

char*int_cur蹉跎的拼音 r_symbol;“”LC_MONETARY当前场所的国际货币

符号

char*mon_decimal_point;“”LC_MONETARY货币量的小数点

char*mon_grouping;“”LC_MONETARY货币量每个数字组的

尺寸

char*mon_thousands_sep;“”LC_MONETARY货币量小数点左边的

数字分组字符

char*negative_sign;“”LC_MONETARY负货币量表示符号的

字符串

char*positive_sign;“”LC_MONETARY正货币量表示符号的

字符串

char*decimal_point;“.”LC_NUMERIC非货币量的小数点

char*grouping;“”LC_NUMERIC非货币量的每个数字

的尺寸

char*thousands_sep;“”LC_NUMERIC非货币量小数点左边

数字分组字符

charfrac_digits;CHAR_MAXLC_MONETARY格式化货币量中小数

点右边的数字位数

charint_frac_digits;CHAR_MAXLC_MONETARY国际格式化货币量中

小数点右边的数字位

charn_cs_precedes;CHAR_MAXLC_MONETARY如果货币符号位于

格式货币量之前,它

设置为1;如果符号在

值以后,设置为0

charn_sep_by_space;CHAR_MAXLC_MONETARY如果货币符号通过空

格从负格式货币量中

分离则设置为1,没有

空格则为0

charn_sign_posn;CHAR_MAXLC_MONETARY负格式货币量值正符

号的位置

charp_cs_precedes;CHAR_MAXLC_MONETARY如果货币符号位于

负格式货币量之前,

它设置为1,如果符号

值以后,设置为0

charp_sep_by_space;CHAR_MAXLC_MONETARY如果货币符号通过空

格从非负格式货币量

中分离则设置为1,没

有空格为0

charp_sign_posn;CHAR_MAXLC_MONETARY非负格式货币量值正

符号的位置

};

结构中的char*成员等于””的长度为0或不被当前场所支持,char成员为非负数CHAR_MAX

的不被当前场所支持.

获得场所设置的详细信息

structlconv*localeconv(void);

定义一个场所

char*setlocale(intcategory,constchar*locale);

13

jmp_bufsetjmp和longjmp使用的类型,用来保存和恢复应用程序环境

保存当前应用程序的环境

intsetjmp(jmp_bufenv);

恢复栈环境和执行场所

voidlongjmp(jmp_bufenv,intval);

这两个函数的使用是有顺序性的一定是先调用setjmp来存储环境变量,再通过longjmp来恢

复环境变量

它的执行过程是这样的(:前面的时行号)

#include

#include

jmp_bufebuf;

voidf2(void);

intmain(void)

{

inti;

puts(\"1\");

0:i=setjmp(ebuf);

1:if(i==0)

{

2:f2();

3:printf(\"Thiswillnotbeprinted\");

}

4:printf(\"%dn\",i);

return0;

}

voidf2(void)

{

5:puts(\"2\");

6:longjmp(ebuf,100);

}

上面的函数的执行过程是这样的

0行第一次执行setjmp时ebuf中保存了当前的系统环境变量,并返回0.接下来执行第1行,

这是i等于0,执行第2行由次进入了f2中,第五行向stdout中打印了2,然后第6行调用了

longjmp恢复了系统环境变量,注意这时函数的执行又回到了第0行而不是执行f2后面的第3

行,这时setjmp返回的函数就不是0了而是longjmp中的100,所以接下来执行的第1行中的i

等于100了直接执行第4行.所以第3行永远也没有机会执行.

14

信号

SIGABRT异常中止,缺省动作是推出程序并返回推出码3

SIGFPE浮点错误,例如溢出,除0或无效操作,缺省终止程序

SIGILL非法指令,缺省终止程序

SIGINTCTRL+C中断,缺省调用INT23H中断

SIGSEGV非法存储访问,缺省终止程序

SIGTERM终止请求传送到程序,缺省终止程序

行为

SIG_DFL使用系统缺省响应,如果调用程序使用流I/O,由运行库建立缓冲区不刷新.

SIG_IGN忽略中断信号,这个值从不会为SIGFPE给出,因为该进程的浮点状态无定义

SIG_ERR错误.

sig_atomic_t

发送一个信号给应用程序,如果以前使用signal安装了一个信号处理程序则执行该程序,没有

则执行信号的缺省行为

intraise(intsig);

设置中断信号处理,signo是中断要处理的信号,必须是上面的信号之一,func是处理函数的地

址或者使用上面的行为,如果func是函数的地址,则这个函数在调用signal时就被安装.

void(*signal(intsigno,void(*func)(int)))(int);

按照如下的方法使用signal函数

#include

#include

#include

#include

jmp_bufenv;

voidfpHander(intsigno);

intmain(void)

{

intjmpflag;

doubled1,d2,r;

0:if(signal(SIGFPE,fpHander)==SIG_ERR)

{

perror(\"Can\'tinstalltheSIGFPEhander\");

abort();

}

else

{

jmpflag=setjmp(env);

if(jmpflag==0)

{

printf(\"Testfordiv:\");

scanf(\"%lf%lf\",&d1,&d2);

1:r=d1/d2;

printf(\"r:%Gn\",r);

printf(\"d2isnot0n\");

r=d1*d2*d2*d1*d2*d2;

2:printf(\"r:%Gn\",r);

printf(\"risnotoverflown\");

3:if(d2==0)

4:raise(SIGFPE);

}

else

{

printf(\"Signalfixedn\");

}

}

return0;

}

voidfpHander(intsigno)

{

printf(\"signo:%dn\",signo);

longjmp(env,-1);

}

一般的如果读入的d2为0的话,那么当执行第1行时就会引发浮点错误信号SIGFPE,而代用

第0行安装的函数fpHander(但是在VC中好像不行,但TC中能通过)如果不能引发SIGFPE

只好自己来引发SIGFPE了第4行调用了raise来引发SIGFPE错误使fpHander函数执行.

15

在这个头文件中定义了一些宏和类型,用来实现可变参数函数.

va_list可变参数表类型.

va_start设置可变参数表头的宏

va_arg检索当前参数的宏

va_end清除可变参数列表的宏,是的函数能够返回

C库函数

1、string.h

1复制

char*strcpy(char*s1,constchar*s2);

将字符串s2复制到s1指定的地址

char*strncpy(char*s1,constchar*s2,size_tlen);

void*memcpy(void*s1,constvoid*s2,size_tlen);

将s2的前len个字符(字节)复制到s1中指定的地址,不加\'0\'

void*memmove(void*s1,constvoid*s2,size_tlen);

当源单元和目的单元缓冲区交迭时使用

size_tstrxfrm(char*s1,constchar*s1,size_tlen);

根据程序当前的区域选项,将s2的前len个字符(字节)复制到s1中指

定的地址,不加\'0\'

2连接

char*strcat(char*s1,constchar*s2);

将字符串s2连接到s1尾部

char*strncat(char*s1,constchar*s2,size_tlen);

将字符串s2的前len个字符连接到s1尾部,不加\'0\'

3比较

int苏武传拼音原文对照版 strcmp(constchar*s1,constchar*s2);

比较字符串s1和s2

intstrncmp(constchar*s1,constchar*s2,size_tlen);

intmemcmp(constvoid*s1,constvoid*s2,size_tlen);

对s1和s2的前len个字符(字节)作比较

intstrcoll(constchar*s1,constchar*s2);

根据程序当前的区域选项中的LC_COLLATE,比较字符串s1和s2

4查找

char*strchr(constchar*s,intch);

void*memchr(constvoid*s,intch,size_tlen);

在s中查找给定字符(字节值)ch第一次出现的位置

char*strrchr(constchar*s,intch);

在串s中查找给定字符ch最后一次出现的位置,r表示从串尾开始

char*strstr(constchar*s1,constchar*s2);

在串s1中查找指定字符串s2第一次出现的位置

size_tstrspn(constchar*s1,constchar*s2);

返回s1中第一个在s2中不存在的字符的索引(find_first_not_of)

size_tstrcspn(constchar*s1,constchar*s2);

返回s1中第一个也在s2中存在的字符的索引(find_first_of)

char*strpbrk(constchar*s1,constchar*s2);

与strcspn类似,区别是返回指针而不是索引

char*strtok(char*s1,constchar*s2);

从串s1中分离出由串s2中指定的分界符分隔开的记号(token)

第一次调用时s1为需分割的字串,此后每次调用都将s1置为NULL,

每次调用strtok返回一个记号,直到返回NULL为止

5其他

size_tstrlen(constchar*s);

求字符串s的长度

void*memset(void*s,intval,size_tlen);

将从s开始的len个字节置为val

char*strerror(interrno);

返回指向错误信息字符串的指针

2、stdlib.h

1字符串转换

doubleatof(constchar*);

intatoi(constchar*);

longatol(constchar*);

doublestrtod(constchar*,char**);

longstrtol(constchar*,char**,int);

unsignedlongstrtoul(constchar*,char**,int);

1>第二组函数的参数意义如下:

constchar*指向需要转换的字符串

char**更新后指向当前数字串之后的一个位置

int基数(进制数)

2>strtol函数举例:

#include

#include

#include

intmain()

{

char*buf=\"0B46474849\";

char*ptr=buf;

while(isspace(*ptr))

ptr++;

while(*ptr!=\'0\')

{

printf(\"%ldn\",strtol(ptr,&ptr,16));

while(isspace(*ptr))

ptr++;

}

return0;

}

2随机数

常量

#defineRAND_MAX0x7FFFrand的最大返回值

函数

voidsrand(unsignedint);置随机数发生器(种子)

intrand(void);返回下一个伪随机数

3内存管理

常量

#defineNULL((void*)0)空指针

函数

void*calloc(size_t,size_t);分配内存,并清零

void*malloc(size_t);分配内存

void*realloc(void*,size_t);重新分配内存,返回新指针

voidfree(void*);释放内存

4与环境的接口

常量

#defineEXIT_SUCCESS0

#defineEXIT_FAILURE1

函数

voidabort(void);

voidexit(int);

intatexit(void(*)(void));

intsystem(constchar*);

char*getenv(constchar*);

5查找与排序

void*bsearch(constvoid*,constvoid*,size_t,size_t,

int(*)(constvoid*,constvoid*));

voidqsort(constvoid*,size_t,size_t,

int(*)(constvoid*,constvoid*));

1>comp函数的返回值

intcomp(constvoid*p1,constvoid*p2)

{

constint*pi1=(constint*)p1;

constint*pi2=(constint*)p2;

return*pi1-*pi2;

}

若第一个指针所指向的内容,排序后应该放在第二个指针所指向的内容之前,那

么应返回负值;

反之返回正值;其他情况返回0.上例中的comp函数将int数组按升序排序.

2>qsort的调用方法

qsort((void*)list,length,sizeof(int),comp);

6整数运算

结构

typedefstruct{intquot,rem;}div_t;

typedefstruct{longquot,rem;}ldiv_t;

函数

intabs(int);

longlabs(long);

div_tdiv(int,int);

ldiv_tldiv(long,long);

7多字节字符

常量

MB_CUR_MAX多字节字符中的最大字节数

函数

size_twcstombs(char*,constwchar_t*,size_t);

intwctomb(char*,wchar_t);

intmblen(constchar*,size_t);

size_tmbstowcs(wchar_t*,constchar*,size_t);

intmbtowc(wchar_t*,constchar*,size_t);

stdlib.h头文件下的常用函数

atof()将字符串转换成浮点数的函数

原形:doubleatof(constchar*s)

功能:把s所指向的字符串转换成double类型。

s格式为:符号数字.数字E符号数字

返回值:字符串的转换值。

头文件:math.h、stdlib.h

atoi()将字符串转换成整型数的函数

原形:intatoi(constchar*s)

功能:把s所指向的字符串转换成int类型。

s格式为:符号数字

返回值:字符串的转换值。若出错则返回0。

头文件:stdlib.h

atol()将字符串转换成长整型数的函数

原形:longatol(constchar*s)

功能:把s所指向的字符串转换成longint类型。

s格式为:符号数字

返回值:字符串的转换值。若出错则返回0。

头文件:stdlib.h

===================================================

calloc()分配内存函数

原形:void*calloc(size_tnitems,size_tsize)

功能:在堆中分配一块内存,将该内存的内容全部清0。

返回值:返回指向新分配内存的指针。空间不够则返回NULL。

头文件:stdlib.h、calloc.h

===================================================

free()释放已分配内存的函数

原形:voidfree(void*block)

功能:释放由calloc、malloc、realloc函数调用所分配的内存。

头文件:stdlib.h、alloc.h

====================================================

gcvt()把双精度数转化成字符串的函数

原形∶char*gcvt(value,ndigit,buf)

其中∶doublevalue是待转化数

intndigit是转化长度

char*buf保存转化后的地址

头文件∶stdlib.h

====================================================

geninterrupt()执行中断函数

原形:voidgeninterrupt(intn)

调用方式:geninterrupt(软中断号)

功能:产生一个8086软中断

注:需先向寄存器传递入口信息(用伪变量)

例如伪变量=要赋的值(入口信息);

调用geninterrupt()函数后得接受出口信息

例如变量名=伪变量

伪变量∶TurboC允许使用伪变量直接访问相应的8086寄存器。伪变量的类型

有两种。

①unsignedint:_AX、_BX、_CX、_DX、_CS、_DS、_SS、_ES、

_SP、_BP、_DI、_SI

②unsignedchar:_AL、_AH、_BL、_BH、_反义词大全1000个 CL、_CH、_DL、_DH

===================================================

getenv()读取环境变量的当前值的函数

原形:char*getenv(constchar*name)

用法:s=getenv(\"环境变量名\");

需先定义char*s;

功能:返回一给定的环境变量值,环境变量名可大写或小写。如果指定的变量在

环境中未定义,则返回一空串。

头文件:stdlib.h

====================================================

itoa()把整形数转换为字符串的函数

原形:char*itoa(intvalue,char*string,intradix)

功能:把value的值转换为以NULL结束的字符串,并把结果存在string中。radix

是转换的基数值,在2到36之间。分配给string的空间必须可容纳返回的所有

字节(最多17字节)。

返回值:指向string的指针

头文件:stdlib.h

==================================================

_lrotl()将一个无符号长整形数左循环移位的函数

原形:unsignedlong_lrotl(unsignedlongvalue,intcount)

功能:将value向左循环移动count位。

返回值:将value向左循环移动count位后的值。

头文件:stdlib.h

_lrotr()将一个无符号长整形数右循环移位的函数

原形:unsignedlong_lrotr(unsignedlongvalue,intcount)

功能:将value向右循环移动count位。

返回值:将value向右循环移动count位后的值。

头文件:stdlib.h

ltoa()把长整形数转换为字符串的函数

原形:char*ltoa(longvalue,char*string,intradix)

功能:把value的值转换为以NULL结束的字符串,并把结果存在string中。radix

是转换的基数值,在2到36之间。分配给string的空间必须可容纳返回的所有

字节(最多33字节)。

返回值:指向string的指针

头文件:stdlib.h

malloc()分配内存函数

原形:void*malloc(size_tsize)

功能:从堆中分配大小为size字节的块。win32也适用。

返回值:返回新分配内存的地址,若无足够内存,返回NULL。

头文件:alloc.h、stdlib.h

============================================================

putenv()将字符串放入当前环境中的函数

原形:intputenv(constchar*name)

用法例:putenv(\"PATH=C:BTC\");

功能:把字符串name加到当前程序运行的环境中。当程序结束后,原环境将得

到恢复。

返回值:0(成功);-1(失败)

头文件:stdlib.h

============================================================

realloc()重新分配内存函数

原形:void*realloc(void*block,size_tsize)

block指向用malloc、calloc或realloc已得到的内存。

size是重新分配的字节。

返回值:重分配的块地址。若不能重分配,则返回NULL。

头文件:stdlib.h

=============================================================

_rotl()将一个无符号整形数左循环移位的函数

原形:unsigned_rotl(unsignedvalue,intcount)

功能:将value向左循环移动count位。

返回值:将value向左循环移动count位后的值。

头文件:stdlib.h

=============================================================

_rotr()将一个无符号整形数右循环移位的函数

原形:unsigned_rotr(unsignedvalue,intcount)

功能:将value向右循环移动count位。

返回值:将value向右循环移动count位后的值。

头文件:stdlib.h

3、stdio.h

stdio.h就是指“standardinput&output\"

意思就是说标准输入输出头文件!

所以了,用到标准输入输出函数时,就要调用这个头文件!

调用printf()前,为了把printf()的正确原型说明引入作用域,必须要用

#include.

对于用可变参数的函数,编译器可能用不同的调用次序。例如,如果可

变参数的调用比固定参数的调用效率低。所以在调用可变参数的函数前,它

的原型说明必须在作用域内,编译器由此知道要用不定长调用机制。在原型

说明中用省略号``...\"来表示可变参数。

关于文件包含(#include<stdio.h>#include\"stdio.h\"

#include\"stdio.h\"

#include

区别:

用双引号的,系统先在引用被包含文件的源文件所在的文件目录

中寻找要包含的文件,若找不到,

再按系统指定的标准方式检索困兽犹斗 其他目录。

用尖括弧时,不检查源文件所在的文件目录而直接按系统标准方

式检索文件目录。

一般情况下,建议自己定义的文件包含用“”,而包含系统的文件用

<>

stdio.h文件

/*Functionprototypes*///函数申明

#ifndef_STDIO_DEFINED

_CRTIMPint__cdecl_filbuf(FILE*);

_CRTIMPint__cdecl_flsbuf(int,FILE*);

#ifdef_POSIX_

_CRTIMPFILE*__cdecl_fsopen(constchar*,constchar*);

#else

_CRTIMPFILE*__cdecl_fsopen(constchar*,constchar*,int);

#endif

_CRTIMPvoid__cdeclclearerr(FILE*);

_CRTIMPint__cdeclfclose(FILE*);

_CRTIMPint__cdecl_fcloseall(void);

#ifdef_POSIX_

_CRTIMPFILE*__cdeclfdopen(int,constchar*);

#else

_CRTIMPFILE*__cdecl_fdopen(int,constchar*);

#endif

_CRTIMPint__cdeclfeof(FILE*);

_CRTIMPint__cdeclferror(FILE*);

_CRTIMPint__cdeclfflush(FILE*);

_CRTIMPint__cdeclfgetc(FILE*);

_CRTIMPint__cdecl_fgetchar(void);

_CRTIMPint__cdeclfgetpos(FILE*,fpos_t*);

_CRTIMPchar*__cdeclfgets(char*,int,FILE*);

#ifdef_POSIX_

_CRTIMPint__cdeclfileno(FILE*);

#else

_CRTIMPint__cdecl_fileno(FILE*);

#endif4、stdarg.h

要在函数中使用参数,首先要包含头文件。这

个头文件声明了一个va_list类型,定义了四个宏,用来遍历

可变参数列表。

voidva_start(va_listap,last);

typeva_arg(va_listap,type);

voidva_end(va_listap);

voidva_copy(va_listdest,va_listsrc);

下面详细介绍这些宏定义:

_start(va_listap,last)

va_start必须第一个调用,它初始化va_list类型的变量

ap,使ap指向第一个可选参数。参数last是可变参数列表

(即函数原型中的省略号…)的前一个参数的名字,也就是

最后类型已确定的函数参数名。因为这个参数的地址将会被

宏va_start用到,所以最好不要是寄存器变量,函数,或者

数组。

对于有可变长参数,但是在可变长参数前没有任何的固

定参数的函数,如intfunc(...)是不允许的。这是ANSIC

所要求的,变参函数在...之前至少得有一个固定参数。这个

参数将被传递给va_start(),然后用va_arg()和va_end()来确

定所有实际调用时可变长参数的类型和值。

typeva_arg(va_listap,type)

宏va_arg展开后是关于下一个参数的类型和值的表达

式,参数type是明确的类型名。

va_arg返回参数列表中的当前参数并使ap指向参数列

表中的下一个参数。

voidva_end(va_listap)

每次调用va_start就必须相应的调用va_end销毁变量ap,

即将指针ap置为NULL。

voidva_copy(va_listdest,va_listsrc)

复制va_list类型的变量。

每次调用va_copy,也必须有相应的va_end调用。

调用者在实际调用参数个数可变的函数时,要通过一定

的方法指明实际参数的个数,例如把最后一个参数置为空字

符串(系统调用execl()就是这样的)、-1或其他的方式(函

数printf()就是通过第一个参数,即输出格式的定义来确定实

际参数的个数的)。

3.举例:

#include

#include

intmain()

{inta,b,c,d,e;

intmax();

cin>>a>>b>>c>>d>>e;

cout<<\"Thebiggerbetweenaandbis

\"<

cout<<\"Thebiggerinthefivenumberis

\"<

return0;

}

intmax()

{va_listap;

intm=integer;

va_start(ap,integer);

for(inti=1;i

{intt=va_arg(ap,int);

if(t>m)m=t;

cout<

}

va_end(ap);

returnm;

}

5、setjmp.h

与刺激的abort()和exit()相比,goto语句看起来是处理异

常的更可行方案。不幸的是,goto是本地的:它只能跳到所

在函数内部的标号上,而不能将控制权转移到所在程序的任

意地点(当然,除非你的所有代码都在main体中)。

为了解决这个限制,C函数库提供了setjmp()和longjmp()

函数,它们分别承担非局部标号和goto作用。头文件

申明了这些函数及同时所需的jmp_buf数据类型。

原理非常简单:

setjmp(j)设置“jump”点,用正确的程序上下文填充

jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指

针,其它重要的寄存器和内存数据。当初始化完jump的上

下文,setjmp()返回0值。

以后调用longjmp(j,r)的效果就是一个非局部的goto或

“长跳转”到由j描述的上下文处(也就是到那原来设置j

的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()

返回r或1(如果r设为0的话)。(记住,setjmp()不能在这

种情况时返回0。)

通过有两类返回值,setjmp()让你知道它正在被怎么使

用。当设置j时,setjmp()如你期望地执行;但当作为长跳转

的目标时,setjmp()就从外面“唤醒”它的上下文。你可以

用longjmp()来终止异常,用setjmp()标记相应的异常处理程

序。

#include

#include

jmp_bufj;

voidraise_exception(void)

{

printf(\"exceptionraisedn\");

longjmp(j,1);/*jumptoexceptionhandler*/

printf(\"thislineshouldneverappearn\");

}

intmain(void)

{

if(setjmp(j)==0)

{

printf(\"\'\'setjmp\'\'isinitializing\'\'j\'\'n\");

raise_exception();

printf(\"thislineshouldneverappearn\");

}

else

{

printf(\"\'\'setjmp\'\'wasjustjumpedinton\");

/*thiscodeistheexceptionhandler*/

}

return0;

}

/*Whenrunyields:

\'\'setjmp\'\'isinitializing\'\'j\'\'

exceptionraised

\'\'setjmp\'\'wasjustjumpedinto

*/

那个填充jmp_buf的函数不在调用longjmp()之前返

回。否则,存储在jmp_buf中的上下文就有问题了:

jmp_bufj;

voidf(void)

{

setjmp(j);

}

intmain(void)

{

f();

longjmp(j,1);/*logicerror*/

return0;

}

所以,你必须把setjmp()处理成只是到其所在位置的一

个非局部跳转。

Longjmp()和setjmp()联合体运行于异常生命期的2和3阶段。

longjmp(j,r)产生异常对象r(一个整数),并且作为返回值传

送到setjmp(j)处。实际上,setjmp()函数通报了异常r。

6、math.h

intabs(inti)返回整型参

数i的绝对值

doublecabs(structcomplexznum)返回复数

znum的绝对值

doublefabs(doublex)返回双精度

参数x的绝对值

longlabs(longn)返回长整型

参数n的绝对值

doubleexp(doublex)返回指数函

数ex的值

doublefrexp(doublevalue,int*eptr)返回value=x*2n

中x的值,n存贮在eptr中

doubleldexp(doublevalue,intexp);返回value*2exp

的值

doublelog(doublex)返回logex

的值

doublelog10(doublex)返回log10x

的值

doublepow(doublex,doubley)返回xy的值

doublepow10(intp)返回10p的

doublesqrt(doublex)返回+√x的

doubleacos(doublex)返回x的反

余弦cos-1(x)值,x为弧度

doubleasin(doublex)返回x的反

正弦sin-1(x)值,x为弧度

doubleatan(doublex)返回x的反

正切tan-1(x)值,x为弧度

doubleatan2(doubley,doublex)返回y/x的反正

切tan-1(x)值,y的x为弧度

doublecos(doublex)返回x的余

弦cos(x)值,x为弧度

doublesin(doublex)返回x的正

弦sin(x)值,x为弧度

doubletan(doublex)返回x的正

切tan(x)值,x为弧度

doublecosh(doublex)返回x的双

曲余弦cosh(x)值,x为弧度

doublesinh(doublex)返回x的双

曲正弦sinh(x)值,x为弧度

doubletanh(doublex)返回x的双

曲正切tanh(x)值,x为弧度

doublehypot(doublex,doubley)返回直角三角

形斜边的长度(z),

x和y为直角

边的长度,z2=x2+y2

7、limits.h

limits.h定义各种数据类型最值常量:

/*limits.h

Definesimplementationspecificlimitsontypevalues.

Copyright(c)1987,1991byBorlandIntern鹿柴王维翻译及赏析 ational

AllRightsReserved.

*/

#ifndef__LIMITS_H

#define__LIMITS_H

#if!defined(__DEFS_H)

#include<_defs.h>

#endif

#defineCHAR_BIT8

#if(\'x80\'<0)

#defineCHAR_MAX127

#defineCHAR_MIN(-128)

#else

#defineCHAR_MAX255

#defineCHAR_MIN0

#endif

#defineSCHAR_MAX127

#defineSCHAR_MIN(-128)

#defineUCHAR_MAX255

#defineSHRT_MAX0x7FFF

#defineSHRT_MIN((int)0x8000)

#defineUSHRT_MAX0xFFFFU

#defineINT_MAX0x7FFF

#defineINT_MIN((int)0x8000)

#defineUINT_MAX0xFFFFU

#defineLONG_MAX0x7FFFFFFFL

#defineLONG_MIN((long)0x80000000L)

#defineULONG_MAX0xFFFFFFFFUL

#defineMB_LEN_MAX1

#endif

8、iso646.h

iso646.h头文件定义了多个宏,可以把这些宏用作C语言的逻辑和位操作符的对等形式:

宏对等操作符

and&&

or||

not!

bitand&

bitor|

xor^

compl~

and_eq&=

or_eq|=

xor_eq^=

not_eq!=

C库函数手册

C库函数手册

分类函数,所在函数库为ctype.h

intisalpha(intch)若ch是字母(\'A\'-\'Z\',\'a\'-\'z\')返回非0值,否则返回0

intisalnum(intch)若ch是字母(\'A\'-\'Z\',\'a\'-\'z\')或数字(\'0\'-\'9\')

返回非0值,否则返回0

intisascii(intch)若ch是字符(ASCII码中的0-127)返回非0值,否则返回0

intiscntrl(intch)若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)

返回非0值,否则返回0

intisdigit(intch)若ch是数字(\'0\'-\'9\')返回非0值,否则返回0

intisgraph(intch)若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0

intislowe意义的近义词 r(intch)若ch是小写字母(\'a\'-\'z\')返回非0值,否则返回0

intisprint(intch)若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0

intispunct(intch)若ch是标点字符(0x00-0x1F)返回非0值,否则返回0

intisspace(intch)若ch是空格(\'\'),水平制表符(\'t\'),回车符(\'r\'),

走纸换行(\'f\'),垂直制表符(\'v\'),换行符(\'n\')

返回非0值,否则返回0

intisupper(intch)若ch是大写字母(\'A\'-\'Z\')返回非0值,否则返回0

intisxdigit(intch)若ch是16进制数(\'0\'-\'9\',\'A\'-\'F\',\'a\'-\'f\')返回非0值,

否则返回0

inttolower(intch)若ch是大写字母(\'A\'-\'Z\')返回相应的小写字母(\'a\'-\'z\')

inttoupper(intch)若ch是小写字母(\'a\'-\'z\')返回相应的大写字母(\'A\'-\'Z\')

数学函数,所在函数库为math.h、stdlib.h、string.h、float.h

intabs(inti)返回整型参数i的绝对值

doublecabs(structcomplexznum)返回复数znum的绝对值

doublefabs(doublex)返回双精度参数x的绝对值

longlabs(longn)返回长整型参数n的绝对值

doubleexp(doublex)返回指数函数ex的值

doublefrexp(doublevalue,int*eptr)返回value=x*2n中x的值,n存贮在eptr中

doubleldexp(doublevalue,intexp);返回value*2exp的值

doublelog(doublex)返回logex的值

doublelog10(doublex)返回log10x的值

doublepow(doublex,doubley)返回xy的值

doublepow10(intp)返回10p的值

doublesqrt(doublex)返回+√x的值

doubleacos(doublex)返回x的反余弦cos-1(x)值,x为弧度

doubleasin(doublex)返回x的反正弦sin-1(x)值,x为弧度

doubleatan(doublex)返回x的反正切tan-1(x)值,x为弧度

doubleatan2(doubley,doublex)返回y/x的反正切tan-1(x)值,y的x为弧度

doublecos(doublex)返回x的余弦cos(x)值,x为弧度

doublesin(doublex)返回x的正弦sin(x)值,x为弧度

doubletan(doublex)返回x的正切tan(x)值,x为弧度

doublecosh(doublex)返回x的双曲余弦cosh(x)值,x为弧度

doublesinh(doublex)返回x的双曲正弦sinh(x)值,x为弧度

doubletanh(doublex)返回x的双曲正切tanh(x)值,x为弧度

doublehypot(doublex,doubley)返回直角三角形斜边的长度(z),

x和y为直角边的长度,z2=x2+y2

doubleceil(doublex)返回不小于x的最小整数

doublefloor(doublex)返回不大于x的最大整数

voidsrand(unsignedseed)初始化随机数发生器

intrand()产生一个随机数并返回这个数

doublepoly(doublex,intn,doublec[])从参数产生一个多项式

doublemodf(doublevalue,double*iptr)将双精度数value分解成尾数和阶

doublefmod(doublex,doubley)返回x/y的余数

doublefrexp(doublevalue,int*eptr)将双精度数value分成尾数和阶

doubleatof(char*nptr)将字符串nptr转换成浮点数并返回这个浮点数

doubleatoi(char*nptr)将字符串nptr转换成整数并返回这个整数

doubleatol(char*nptr)将字符串nptr转换成长整数并返回这个整数

char*ecvt(doublevalue,intndigit,int*decpt,int*sign)

将浮点数value转换成字符串并返回该字符串

char*fcvt(doublevalue,intndigit,int*decpt,int*sign)

将浮点数value转换成字符串并返回该字符串

char*gcvt(doublevalue,intndigit,char*buf)

将数value转换成字符串并存于buf中,并返回buf的指针

char*ultoa(unsignedlongvalue,char*string,intradix)

将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char*ltoa(longvalue,char*string,intradix)

将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char*itoa(intvalue,char*string,intradix)

将整数value转换成字符串存入string,radix为转换时所用基数

doubleatof(char*nptr)将字符串nptr转换成双精度数,并返回这个数,错误返回0

intatoi(char*nptr)将字符串nptr转换成整型数,并返回这个数,错误返回0

longatol(char*nptr)将字符串nptr转换成长整型数,并返回这个数,错误返回0

doublestrtod(char*str,char**endptr)将字符串str转换成双精度数,并返回这个数,

longstrtol(char*str,char**endptr,intbase)将字符串str转换成长整型数,

并返回这个数,

intmatherr(structexception*e)

用户修改数学错误返回信息函数(没有必要使用)

double_matherr(_mexcepwhy,char*fun,double*arg1p,

double*arg2p,doubleretval)

用户修改数学错误返回信息函数(没有必要使用)

unsignedint_clear87()清除浮点状态字并返回原来的浮点状态

void_fpreset()重新初使化浮点数学程序包

unsignedint_status87()返回浮点状态字

目录函数,所在函数库为dir.h、dos.h

intchdir(char*path)使指定的目录path(如:\"C:WPS\")变成当前的工作目录,成

功返回0

intfindfirst(char*pathname,structffblk*ffblk,intattrib)查找指定的文件,成功

返回0

pathname为指定的目录名和文件名,如\"C:WPSTXT\"

ffblk为指定的保存文件信息的一个结构,定义如下:

┏━━━━━━━━━━━━━━━━━━┓

┃structffblk┃

┃{┃

┃charff_reserved[21];/*DOS保留字*/┃

┃charff_attrib;/*文件属性*/┃

┃intff_ftime;/*文件时间*/┃

┃intff_fdate;/*文件日期*/┃

┃longff_fsize;/*文件长度*/┃

┃charff_name[13];/*文件名*/┃

┃}┃

┗━━━━━━━━━━━━━━━━━━┛

attrib为文件属性,由以下字符代表

┏━━━━━━━━━┳━━━━━━━━┓

┃FA_RDONLY只读文件┃FA_LABEL卷标号┃

┃FA_HIDDEN隐藏文件┃FA_DIREC目录┃

┃FA_SYSTEM系统文件┃FA_ARCH档案┃

┗━━━━━━━━━┻━━━━━━━━┛

例:

structffblkff;

findfirst(\"*.wps\",&ff,FA_RDONLY);

intfindnext(structffblk*ffblk)取匹配finddirst的文件,成功返回0

voidfumerge(char*path,char*drive,char*dir,char*name,char*ext)

此函数通过盘符drive(C:、A:等),路径dir(TC、BCLIB等),

文件名name(TC、WPS等),扩展名ext(.EXE、.COM等)组成一个文件名

存与path中.

intfnsplit(char*path,char*drive,char*dir,char*name,char*ext)

此函数将文件名path分解成盘符drive(C:、A:等),路径dir(TC、BCLIB等),

文件名name(TC、WPS等),扩展名ext(.EXE、.COM等),并分别存入相应的变量中.

intgetcurdir(intdrive,char*direc)此函数返回指定驱动器的当前工作目录名称

drive指定的驱动器(0=当前,1=A,2=B,3=C等)

direc保存指定驱动器当前工作路径的变量成功返回0

char*getcwd(char*buf,iintn)此函数取当前工作目录并存入buf中,直到n个字

节长为为止.错误返回NULL

intgetdisk()取当前正在使用的驱动器,返回一个整数(0=A,1=B,2=C等)

intsetdisk(intdrive)设置要使用的驱动器drive(0=A,1=B,2=C等),

返回可使用驱动器总数

intmkdir(char*pathname)建立一个新的目录pathname,成功返回0

intrmdir(char*pathname)删除一个目录pathname,成功返回0

char*mktemp(char*template)构造一个当前目录上没有的文件名并存于template中

char*searchpath(char*pathname)利用MSDOS找出文件filename所在路径,

,此函数使用DOS的PATH变量,未找到文件返回NULL

进程函数,所在函数库为stdlib.h、process.h

voidabort()此函数通过调用具有出口代码3的_exit写一个终止信息于stderr,

并异常终止程序。无返回值

intexec…装入和运行其它程序

intexecl(char*pathname,char*arg0,char*arg1,…,char*argn,NULL)

intexecle(char*pathname,char*arg0,char*arg1,…,

char*argn,NULL,char*envp[])

intexeclp(char*pathname,char*arg0,char*arg1,…,NULL)

intexeclpe(char*pathname,char*arg0,char*arg1,…,NULL,char*envp[])

intexecv(char*pathname,char*argv[])

intexecve(char*pathname,char*argv[],char*envp[])

intexecvp(char*pathname,char*argv[])

intexecvpe(char*pathname,char*argv[],char*envp[])

exec函数族装入并运行程序pathname,并将参数

arg0(arg1,arg2,argv[],envp[])传递给子程序,出错返回-1

在exec函数族中,后缀l、v、p、e添加到exec后,

所指定的函数将具有某种操作能力

有后缀p时,函数可以利用DOS的PATH变量查找子程序文件。

l时,函数中被传递的参数个数固定。

v时,函数中被传递的参数个数不固定。

e时,函数传递指定参数envp,允许改变子进程的环境,

无后缀e时,子进程使用当前程序的环境。

void_exit(intstatus)终止当前程序,但不清理现场

voidexit(intstatus)终止当前程序,关闭所有文件,写缓冲区的输出(等待输出),

并调用任何寄存器的\"出口函数\",无返回值

intspawn…运行子程序

intspawnl(intmode,char*pathname,char*arg0,char*arg1,…,

char*argn,NULL)

intspawnle(intmode,char*pathname,char*arg0,char*arg1,…,

char*argn,NULL,char*envp[])

intspawnlp(intmode,char*pathname,char*arg0,char*arg1,…,

char*argn,NULL)

intspawnlpe(intmode,char*pathname,char*arg0,char*arg1,…,

char*argn,NULL,char*envp[])

intspawnv(intmode,char*pathname,char*argv[])

intspawnve(intmode,char*pathname,char*argv[],char*envp[])

intspawnvp(intmode,char*pathname,char*argv[])

intspawnvpe(intmode,char*pathname,char*argv[],char*envp[])

spawn函数族在mode模式下运行子程序pathname,并将参数

arg0(arg1,arg2,argv[],envp[])传递给子程序.出错返回-1

mode为运行模式

mode为P_WAIT表示在子程序运行完后返回本程序

P_NOWAIT表示在子程序运行时同时运行本程序(不可用)

P_OVERLAY表示在本程序退出后运行子程序

在spawn函数族中,后缀l、v、p、e添加到spawn后,

所指定的函数将具有某种操作能力

有后缀p时,函数利用DOS的PATH查找子程序文件

l时,函数传递的参数个数固定.

v时,函数传递的参数个数不固定.

e时,指定参数envp可以传递给子程序,允许改变子程序运行环境.

当无后缀e时,子程序使用本程序的环境.

intsystem(char*command)将MSDOS命令command传递给DOS执行

转换子程序,函数库为math.h、stdlib.h、ctype.h、float.h

char*ecvt(doublevalue,intndigit,int*decpt,int*sign)

将浮点数value转换成字符串并返回该字符串

char*fcvt(doublevalue,intndigit,int*decpt,int*sign)

将浮点数value转换成字符串并返回该字符串

char*gcvt(doublevalue,intndigit,char*buf)

将数value转换成字符串并存于buf中,并返回buf的指针

char*ultoa(unsignedlongvalue,char*string,intradix)

将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char*ltoa(longvalue,char*string,intradix)

将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char*itoa(intvalue,char*string,intradix)

将整数value转换成字符串存入string,radix为转换时所用基数

doubleatof(char*nptr)将字符串nptr转换成双精度数,并返回这个数,错误返回0

intatoi(char*nptr)将字符串nptr转换成整型数,并返回这个数,错误返回0

longatol(char*nptr)将字符串nptr转换成长整型数,并返回这个数,错误返回0

doublestrtod(char*str,char**endptr)将字符串str转换成双精度数,并返回这个数,

longstrtol(char*str,char**endptr,intbase)将字符串str转换成长整型数,

并返回这个数,

inttoascii(intc)返回c相应的ASCII

inttolower(intch)若ch是大写字母(\'A\'-\'Z\')返回相应的小写字母(\'a\'-\'z\')

int_tolower(intch)返回ch相应的小写字母(\'a\'-\'z\')

inttoupper(intch)若ch是小写字母(\'a\'-\'z\')返回相应的大写字母(\'A\'-\'Z\')

int_toupper(intch)返回ch相应的大写字母(\'A\'-\'Z\')

诊断函数,所在函数库为assert.h、math.h

voidassert(inttest)一个扩展成if语句那样的宏,如果test测试失败,

就显示一个信息并异常终止程序,无返回值

voidperror(char*string)本函数将显示最近一次的错误信息,格式如下:

字符串string:错误信息

char*strerror(char*str)本函数返回最近一次的错误信息,格式如下:

字符串str:错误信息

intmatherr(structexception*e)

用户修改数学错误返回信息函数(没有必要使用)

double_matherr(_mexcepwhy,char*fun,double*arg1p,

double*arg2p,doubleretval)

用户修改数学错误返回信息函数(没有必要使用)

输入输出子程序,函数库为io.h、conio.h、stat.h、dos.h、stdio.h、signal.h

intkbhit()本函数返回最近所敲的按键

intfgetchar()从控制台(键盘)读一个字符,显示在屏幕上

intgetch()从控制台(键盘)读一个字符,不显示在屏幕上

intputch()向控制台(键盘)写一个字符

intgetchar()从控制台(键盘)读一个字符,显示在屏幕上

intputchar()向控制台(键盘)写一个字符

intgetche()从控制台(键盘)读一个字符,显示在屏幕上

intungetch(intc)把字符c退回给控制台(键盘)

char*cgets(char*string)从控制台(键盘)读入字符串存于string中

intscanf(char*format[,argument…])从控制台读入一个字符串,分别对各个参数进行

赋值,使用BIOS进行输出

intvscanf(char*format,Valistparam)从控制台读入一个字符串,分别对各个参数进行

赋值,使用BIOS进行输出,参数从Valistparam中取得

intcscanf(char*format[,argument…])从控制台读入一个字符串,分别对各个参数进行

赋值,直接对控制台作操作,比如显示器在显示时字符时即为直接写频方式显示

intsscanf(char*string,char*format[,argument,…])通过字符串string,分别对各个

参数进行赋值

intvsscanf(char*string,char*format,Vlistparam)通过字符串string,分别对各个

参数进行赋值,参数从Vlistparam中取得

intputs(char*string)发关一个字符串string给控制台(显示器),

使用BIOS进行输出

voidcputs(char*string)发送一个字符串string给控制台(显示器),

直接对控制台作操作,比如显示器即为直接写频方式显示

intprintf(char*format[,argument,…])发送格式化字符串输出给控制台(显示器)

使用BIOS进行输出

intvprintf(char*format,Valistparam)发送格式化字符串输出给控制台(显示器)

使用BIOS进行输出,参数从Valistparam中取得

intcprintf(char*format[,argument,…])发送格式化字符串输出给控制台(显示器),

直接对控制台作操作,比如显示器即为直接写频方式显示

intvcprintf(char*format,Valistparam)发送格式化字符串输出给控制台(显示器),

直接对控制台作操作,比如显示器即为直接写频方式显示,

参数从Valistparam中取得

intsprintf(char*string,char*format[,argument,…])

将字符串string的内容重新写为格式化后的字符串

intvsprintf(char*string,char*format,Valistparam)

将字杨花榆荚无才思的下一句 符串string的内容重新写为格式化后的字符串,参数从Valistparam中取得

intrename(char*oldname,char*newname)将文件oldname的名称改为newname

intioctl(inthandle,intcmd[,int*argdx,intargcx])

本函数是用来控制输入/输出设备的,请见下表:

┌───┬────────────────────────────┐

│cmd值│功能│

├───┼────────────────────────────┤

│0│取出设备信息│

│1│设置设备信息│

│2│把argcx字节读入由argdx所指的地址│

│3│在argdx所指的地址写argcx字节│

│4│除把handle当作设备号(0=当前,1=A,等)之外,均和cmd=2时一样│

│5│除把handle当作设备号(0=当前,1=A,等)之外,均和cmd=3时一样│

│6│取输入状态│

│7│取输出状态│

│8│测试可换性;只对于DOS3.x│

│11│置分享冲突的重算计数;只对DOS3.x│

└───┴────────────────────────────┘

int(*ssignal(intsig,int(*action)())()执行软件信号(没必要使用)

intgsignal(intsig)执行软件信号(没必要使用)

int_open(char*pathname,intaccess)为读或写打开一个文件,

按后按access来确定是读文件还是写文件,access值见下表

┌──────┬────────────────────┐

│access值│意义│

├──────┼────────────────────┤

│O_RDONLY│读文件│

│O_WRONLY│写文件│

│O_RDWR│即读也写│

│O_NOINHERIT│若文件没有传递给子程序,则被包含│

│O_DENYALL│只允许当前处理必须存取的文件│

│O_DENYWRITE│只允许从任何其它打开的文件读│

│O_DENYREAD│只允许从任何其它打开的文件写│

│O_DENYNONE│允许其它共享打开的文件│

└──────┴────────────────────┘

intopen(char*pathname,intaccess[,intpermiss])为读或写打开一个文件,

按后按access来确定是读文件还是写文件,access值见下表

┌────┬────────────────────┐

│access值│意义│

├────┼────────────────────┤

│O_RDONLY│读文件│

│O_WRONLY│写文件│

│O_RDWR│即读也写│

│O_NDELAY│没有使用;对UNIX系统兼容│

│O_APPEND│即读也写,但每次写总是在文件尾添加│

│O_CREAT│若文件存在,此标志无用;若不存在,建新文件│

│O_TRUNC│若文件存在,则长度被截为0,属性不变│

│O_EXCL│未用;对UNIX系统兼容│

│O_BINARY│此标志可显示地给出以二进制方式打开文件│

│O_TEXT│此标志可用于显示地给出以文本方式打开文件│

└────┴────────────────────┘

permiss为文件属性,可为以下值:

S_IWRITE允许写S_IREAD允许读S_IREAD|S_IWRITE允许读、写

intcreat(char*filename,intpermiss)建立一个新文件filename,并设定

读写性。permiss为文件读写性,可以为以下值

S_IWRITE允许写S_IREAD允许读S_IREAD|S_IWRITE允许读、写

int_creat(char*filename,intattrib)建立一个新文件filename,并设定文件

属性。attrib为文件属性,可以为以下值

FA_RDONLY只读FA_HIDDEN隐藏FA_SYSTEM系统

intcreatnew(char*filenamt,intattrib)建立一个新文件filename,并设定文件

属性。attrib为文件属性,可以为以下值

FA_RDONLY只读FA_HIDDEN隐藏FA_SYSTEM系统

intcreattemp(char*filenamt,intattrib)建立一个新文件filename,并设定文件

属性。attrib为文件属性,可以为以下值

FA_RDONLY只读FA_HIDDEN隐藏FA_SYSTEM系统

intread(inthandle,void*buf,intnbyte)从文件号为handle的文件中读nbyte个字符

存入buf中

int_read(inthandle,void*buf,intnbyte)从文件号为handle的文件中读nbyte个字符

存入buf中,直接调用MSDOS进行操作.

intwrite(inthandle,void*buf,intnbyte)将buf中的nbyte个字符写入文件号

为handle的文件中

int_write(inthandle,void*buf,intnbyte)将buf中的nbyte个字符写入文件号

为handle的文件中

intdup(inthandle)复制一个文件处理指针handle,返回这个指针

intdup2(inthandle,intnewhandle)复制一个文件处理指针handle到newhandle

inteof(int*handle)检查文件是否结束,结束返回1,否则返回0

longfilelength(inthandle)返回文件长度,handle为文件号

intsetmode(inthandle,unsignedmode)本函数用来设定文件号为handle的文件的打

开方式

intgetftime(inthandle,structftime*ftime)读取文件号为handle的文件的时间,

并将文件时间存于ftime结构中,成功返回0,ftime结构如下:

┌─────────────────┐

│structftime│

│{│

│unsignedft_tsec:5;/*秒*/│

│unsignedft_min:6;/*分*/│

│unsignedft_hour:5;/*时*/│

│unsignedft_day:5;/*日*/│

│unsignedft_month:4;/*月*/│

│unsignedft_year:1;/*年-1980*/│

│}│

└─────────────────┘

intsetftime(inthandle,structftime*ftime)重写文件号为handle的文件时间,

新时间在结构ftime中.成功返回0.结构ftime如下:

┌─────────────────┐

│structftime│

│{│

│unsignedft_tsec:5;/*秒*/│

│unsignedft_min:6;/*分*/│

│unsignedft_hour:5;/*时*/│

│unsignedft_day:5;/*日*/│

│unsignedft_month:4;/*月*/│

│unsignedft_year:1;/*年-1980*/│

│}│

└─────────────────┘

longlseek(inthandle,longoffset,intfromwhere)本函数将文件号为handle的文件

的指针移到fromwhere后的第offset个字节处.

SEEK_SET文件开关SEEK_CUR当前位置SEEK_END文件尾

longtell(inthandle)本函数返回文件号为handle的文件指针,以字节表示

intisatty(inthandle)本函数用来取设备handle的类型

intlock(inthandle,longoffset,longlength)对文件共享作封锁

intunlock(inthandle,longoffset,longlength)打开对文件共享的封锁

intclose(inthandle)关闭handle所表示的文件处理,handle是从_creat、creat、

creatnew、creattemp、dup、dup2、_open、open中的一个处调用获得的文件处理

成功返回0否则返回-1,可用于UNIX系统

int_close(inthandle)关闭handle所表示的文件处理,handle是从_creat、creat、

creatnew、creattemp、dup、dup2、_open、open中的一个处调用获得的文件处理

成功返回0否则返回-1,只能用于MSDOS系统

FILE*fopen(char*filename,char*type)打开一个文件filename,打开方式为type,

并返回这个文件指针,type可为以下字符串加上后缀

┌──┬────┬───────┬────────┐

│type│读写性│文本/2进制文件│建新/打开旧文件│

├──┼────┼───────┼────────┤

│r│读│文本│打开旧的文件│

│w│写│文本│建新文件│

│a│添加│文本│有就打开无则建新│

│r+│读/写│不限制│打开│

│w+│读/写│不限制│建新文件│

│a+│读/添加│不限制│有就打开无则建新│

└──┴────┴───────┴────────┘

可加的后缀为t、b。加b表示文件以二进制形式进行操作,t没必要使用

例:┌──────────────────┐

│#include

│main()│

│{│

│FILE*fp;│

│fp=fopen(\"C:\",\"r+b\");│

└──────────────────┘

FILE*fdopen(intahndle,char*type)

FILE*freopen(char*filename,char*type,FILE*stream)

intgetc(FILE*stream)从流stream中读一个字符,并返回这个字符

intputc(intch,FILE*stream)向流stream写入一个字符ch

intgetw(FILE*stream)从流stream读入一个整数,错误返回EOF

intputw(intw,FILE*stream)向流stream写入一个整数

intungetc(charc,FILE*stream)把字符c退回给流stream,下一次读进的字符将是c

intfgetc(FILE*stream)从流stream处读一个字符,并返回这个字符

intfputc(intch,FILE*stream)将字符ch写入流stream中

char*fgets(char*string,intn,FILE*stream)从流stream中读n个字符存入string中

intfputs(char*string,FILE*stream)将字符串string写入流stream中

intfread(void*ptr,intsize,intnitems,FILE*stream)从流stream中读入nitems

个长度为size的字符串存入ptr中

intfwrite(void*ptr,intsize,intnitems,FILE*stream)向流stream中写入nitems

个长度为size的字符串,字符串在ptr中

intfscanf(FILE*stream,char*format[,argument,…])以格式化形式从流stream中

读入一个字符串

intvfscanf(FILE*stream,char*format,Valistparam)以格式化形式从流stream中

读入一个字符串,参数从Valistparam中取得

intfprintf(FILE*stream,char*format[,argument,…])以格式化形式将一个字符

串写给指定的流stream

intvfprintf(FILE*stream,char*format,Valistparam)以格式化形式将一个字符

串写给指定的流stream,参数从Valistparam中取得

intfseek(FILE*stream,longoffset,intfromwhere)函数把文件指针移到fromwhere

所指位置的向后offset个字节处,fromwhere可以为以下值:

SEEK_SET文件开关SEEK_CUR当前位置SEEK_END文件尾

longftell(FILE*stream)函数返回定位在stream中的当前文件指针位置,以字节表示

intrewind(FILE*stream)将当前文件指针stream移到文件开头

intfeof(FILE*stream)检测流stream上的曹操的诗以什么见长 文件指针是否在结束位置

intfileno(FILE*stream)取流stream上的文件处理,并返回文件处理

intferror(FILE*stream)检测流stream上是否有读写错误,如有错误就返回1

voidclearerr(FILE*stream)清除流stream上的读写错误

voidsetbuf(FILE*stream,char*buf)给流stream指定一个缓冲区buf

voidsetvbuf(FILE*stream,char*buf,inttype,unsignedsize)

给流stream指定一个缓冲区buf,大小为size,类型为type,type的值见下表

┌───┬───────────────────────────────┐

│type值│意义│

├───┼───────────────────────────────┤

│_IOFBF│文件是完全缓冲区,当缓冲区是空时,下一个输入操作将企图填满整个缓│

││冲区.在输出时,在把任何数据写到文件之前,将完全填充缓冲区.│

│_IOLBF│文件是行缓冲区.当缓冲区为空时,下一个输入操作将仍然企图填整个缓│

││冲区.然而在输出时,每当新行符写到文件,缓冲区就被清洗掉.│

│_IONBF│文件是无缓冲的.buf和size参数是被忽略的.每个输入操作将直接从文│

││件读,每个输出操作将立即把数据写到文件中.│

└───┴───────────────────────────────┘

intfclose(FILE*stream)关闭一个流,可以是文件或设备(例如LPT1)

intfcloseall()关闭所有除stdin或stdout外的流

intfflush(FILE*stream)关闭一个流,并对缓冲区作处理

处理即对读的流,将流内内容读入缓冲区;

对写的流,将缓冲区内内容写入流。成功返回0

intfflushall()关闭所有流,并对流各自的缓冲区作处理

处理即对读的流,将流内内容读入缓冲区;

对写的流,将缓冲区内内容写入流。成功返回0

intaccess(char*filename,intamode)本函数检查文件filename并返回文件的属性,

函数将属性存于amode中,amode由以下位的组合构成

06可以读、写04可以读02可以写01执行(忽略的)00文件存在

如果filename是一个目录,函数将只确定目录是否存在

函数执行成功返回0,否则返回-1

intchmod(char*filename,intpermiss)本函数用于设定文件filename的属性

permiss可以为以下值

S_IWRITE允许写S_IREAD允许读S_IREAD|S_IWRITE允许读、写

int_chmod(char*filename,intfunc[,intattrib]);

本函数用于读取或设定文件filename的属性,

当func=0时,函数返回文件的属性;当func=1时,函数设定文件的属性

若为设定文件属性,attrib可以为下列常数之一

FA_RDONLY只读FA_HIDDEN隐藏FA_SYSTEM系统

接口子程序,所在函数库为:dos.h、bios.h

unsignedsleep(unsignedseconds)暂停seconds微秒(百分之一秒)

intunlink(char*filename)删除文件filename

unsignedFP_OFF(voidfar*farptr)本函数用来取远指针farptr的偏移量

unsignedFP_SEG(voidfar*farptr)本函数用来没置远指针farptr的段值

voidfar*MK_FP(unsignedseg,unsignedoff)根据段seg和偏移量off构造一个far指针

unsignedgetpsp()取程序段前缀的段地址,并返回这个地址

char*parsfnm(char*cmdline,structfcb*fcbptr,intoption)

函数分析一个字符串,通常,对一个文件名来说,是由cmdline所指的一个命令行.

文件名是放入一个FCB中作为一个驱动器,文件名和扩展名.FCB是由fcbptr所指

定的.option参数是DOS分析系统调用时,AL文本的值.

intabsread(intdrive,intnsects,intsectno,void*buffer)本函数功能为读特定的

磁盘扇区,drive为驱动器号(0=A,1=B等),nsects为要读的扇区数,sectno为开始的逻

辑扇区号,buffer为保存所读数据的保存空间

intabswrite(intdrive,intnsects,intsectno,void*buffer)本函数功能为写特定的

磁盘扇区,drive为驱动器号(0=A,1=B等),nsects为要写的扇区数,sectno为开始的逻

辑扇区号,buffer为保存所写数据的所在空间

voidgetdfree(intdrive,structdfree*dfreep)本函数用来取磁盘的自由空间,

drive为磁盘号(0=当前,1=A等).函数将磁盘特性的由dfreep指向的dfree结构中.

dfree结构如下:

┌───────────────────┐

│structdfree│

│{│

│unsigneddf_avail;/*有用簇个数*/│

│unsigneddf_total;/*总共簇个数*/│

│unsigneddf_bsec;/*每个扇区字节数*/│

│unsigneddf_sclus;/*每个簇扇区数*/│

│}│

└───────────────────┘

charfar*getdta()取磁盘转换地址DTA

voidsetdta(charfar*dta)设置磁盘转换地址DTA

vo笑到肚子痛的100个笑话 idgetfat(intdrive,fatinfo*fatblkp)

本函数返回指定驱动器drive(0=当前,1=A,2=B等)的文件分配表信息

并存入结构fatblkp中,结构如下:

┌──────────────────┐

│structfatinfo│

│{│

│charfi_sclus;/*每个簇扇区数*/│

│charfi_fatid;/*文件分配表字节数*/│

│intfi_nclus;/*簇的数目*/│

│intfi_bysec;/*每个扇区字节数*/│

│}│

└──────────────────┘

voidgetfatd(structfatinfo*fatblkp)本函数返回当前驱动器的文件分配表信息,

并存入结构fatblkp中,结构如下:

┌──────────────────┐

│structfatinfo│

│{│

│charfi_sclus;/*每个簇扇区数*/│

│charfi_fatid;/*文件分配表字节数*/│

│intfi_nclus;/*簇的数目*/│

│intfi_bysec;/*每个扇区字节数*/│

│}│

└──────────────────┘

intbdos(intdosfun,unsigneddosdx,unsigneddosal)本函数对MSDOS系统进行调用,

dosdx为寄存器dx的值,dosal为寄存器al的值,dosfun为功能号

intbdosptr(intdosfun,void*argument,unsiigneddosal)本函数对MSDOS系统进行调用,

argument为寄存器dx的值,dosal为寄存器al的值,dosfun为功能号

intint86(intintr_num,unionREGS*inregs,unionREGS*outregs)

执行intr_num号中断,用户定义的寄存器值存于结构inregs中,

执行完后将返回的寄存器值存于结构outregs中.

intint86x(intintr_num,unionREGS*inregs,unionREGS*outregs,

structSREGS*segregs)执行intr_num号中断,用户定义的寄存器值存于

结构inregs中和结构segregs中,执行完后将返回的寄存器值存于结构outregs中.

intintdos(unionREGS*inregs,unionREGS*outregs)

本函数执行DOS中断0x21来调用一个指定的DOS函数,用户定义的寄存器值

存于结构inregs中,执行完后函数将返回的寄存器值存于结构outregs中

intintdosx(unionREGS*inregs,unionREGS*outregs,structSREGS*segregs)

本函数执行DOS中断0x21来调用一个指定的DOS函数,用户定义的寄存器值

存于结构inregs和segregs中,执行完后函数将返回的寄存器值存于结构outregs中

voidintr(intintr_num,structREGPACK*preg)本函数中一个备用的8086软件中断接口

它能产生一个由参数intr_num指定的8086软件中断.函数在执行软件中断前,

从结构preg复制用户定义的各寄存器值到各个寄存器.软件中断完成后,

函数将当前各个寄存器的值复制到结构preg中.参数如下:

intr_num被执行的中断号

preg为保存用户定义的寄存器值的结构,结构如下

┌──────────────────────┐

│structREGPACK│

│{│

│unsignedr_ax,r_bx,r_cx,r_dx;│

│unsignedr_bp,r_si,r_di,r_ds,r_es,r_flags;│

│}│

└──────────────────────┘

函数执行完后,将新的寄存器值存于结构preg中

voidkeep(intstatus,intsize)以status状态返回MSDOS,但程序仍保留于内存中,所占

用空间由size决定.

voidctrlbrk(int(*fptr)())设置中断后的对中断的处理程序.

voiddisable()禁止发生中断

voidenable()允许发生中断

voidgeninterrupt(intintr_num)执行由intr_num所指定的软件中断

voidinterrupt(*getvect(intintr_num))()返回中断号为intr_num的中断处理程序,

例如:old_int_10h=getvect(0x10);

voidsetvect(intintr_num,voidinterrupt(*isr)())设置中断号为intr_num的中

断处理程序为isr,例如:setvect(0x10,new_int_10h);

voidharderr(int(*fptr)())定义一个硬件错误处理程序,

每当出现错误时就调用fptr所指的程序

voidhardresume(intrescode)硬件错误处理函数

voidhardretn(interrcode)硬件错误处理函数

intinport(intprot)从指定的输入端口读入一个字,并返回这个字

intinportb(intport)从指定的输入端口读入一个字节,并返回这个字节

voidoutport(intport,intword)将字word写入指定的输出端口port

voidoutportb(intport,charbyte)将字节byte写入指定的输出端口port

intpeek(intsegment,unsignedoffset)函数返回segment:offset处的一个字

charpeekb(intsegment,unsignedoffset)函数返回segment:offset处的一个字节

voidpoke(intsegment,intoffset,charvalue)将字value写到segment:offset处

voidpokeb(intsegment,intoffset,intvalue)将字节value写到segment:offset处

intrandbrd(structfcb*fcbptr,intreccnt)

函数利用打开fcbptr所指的FCB读reccnt个记录.

intrandbwr(structfcb*fcbptr,intreccnt)

函数将fcbptr所指的FCB中的reccnt个记录写到磁盘上

voidsegread(structSREGS*segtbl)函数把段寄存器的当前值放进结构segtbl中

intgetverify()取检验标志的当前状态(0=检验关闭,1=检验打开)

voidsetverify(intvalue)设置当前检验状态,

value为0表示关闭检验,为1表示打开检验

intgetcbrk()本函数返回控制中断检测的当前设置

intsetcbrk(intvalue)本函数用来设置控制中断检测为接通或断开

当value=0时,为断开检测.当value=1时,为接开检测

intdosexterr(structDOSERR*eblkp)取扩展错误.在DOS出现错误后,此函数将扩充的

错误信息填入eblkp所指的DOSERR结构中.该结构定义如下:

┌──────────────┐

│structDOSERR│

│{│

│intexterror;/*扩展错误*/│

│charclass;/*错误类型*/│

│charaction;/*方式*/│

│charlocus;/*错误场所*/│

│}│

└──────────────┘

intbioscom(intcmd,chartype,intport)本函数负责对数据的通讯工作,

cmd可以为以下值:

0置通讯参数为字节byte值1发送字符通过通讯线输出

2从通讯线接受字符3返回通讯的当前状态

port为通讯端口,port=0时通讯端口为COM1,port=1时通讯端口为COM2,以此类推

byte为传送或接收数据时的参数,为以下位的组合:

┌───┬─────┬───┬─────┬───┬─────┐

│byte值│意义│byte值│意义│byte值│意义││

├───┼─────┼───┼─────┼───┼─────┤

│0x02│7数据位│0x03│8数据位│0x00│1停止位││

│0x04│2停止位│0x00│无奇偶性│0x08│奇数奇偶性││

│0x18│偶数奇偶性│0x00│110波特│0x20│150波特││

│0x40│300波特│0x60│600波特│0x80│1200波特││

│0xA0│2400波特│0xC0│4800波特│0xE0│9600波特││

└───┴─────┴───┴─────┴───┴─────┘

例如:0xE0|0x08|0x00|0x03即表示置通讯口为9600波特,奇数奇偶性,1停止位,

8数据位.

函数返回值为一个16位整数,定义如下:

第15位超时

第14位传送移位寄存器空

第13位传送固定寄存器空

第12位中断检测

第11位帧错误

第10位奇偶错误

第9位过载运行错误

第8位数据就绪

第7位接收线信号检测

第6位环形指示器

第5位数据设置就绪

第4位清除发送

第3位接收线信号检测器

第2位下降边环形检测器

第1位数据设置就绪

第0位清除发送

intbiosdisk(intcmd,intdrive,inthead,inttrack,

intsector,intnsects,void*buffer)

本函数用来对驱动器作一定的操作,cmd为功能号,

drive为驱动器号(0=A,1=B,0x80=C,0x81=D,0x82=E等).cmd可为以下值:

0重置软磁盘系统.这强迫驱动器控制器来执行硬复位.忽略所有其它参数.

1返回最后的硬盘操作状态.忽略所有其它参数

2读一个或多个磁盘扇区到内存.读开始的扇区由head、track、sector给出。

扇区号由nsects给出。把每个扇区512个字节的数据读入buffer

3从内存读数据写到一个或多个扇区。写开始的扇区由head、track、sector

给出。扇区号由nsects给出。所写数据在buffer中,每扇区512个字节。

4检验一个或多个扇区。开始扇区由head、track、sector给出。扇区号由

nsects给出。

5格式化一个磁道,该磁道由head和track给出。buffer指向写在指定track上

的扇区磁头器的一个表。

以下cmd值只允许用于XT或AT微机:

6格式化一个磁道,并置坏扇区标志。

7格式化指定磁道上的驱动器开头。

8返回当前驱动器参数,驱动器信息返回写在buffer中(以四个字节表示)。

9初始化一对驱动器特性。

10执行一个长的读,每个扇区读512加4个额外字节

11执行一个长的写,每个扇区写512加4个额外字节

12执行一个磁盘查找

13交替磁盘复位

14读扇区缓冲区

15写扇区缓冲区

16检查指定的驱动器是否就绪

17复核驱动器

18控制器RAM诊断

19驱动器诊断

20控制器内部诊

函数返回由下列位组合成的状态字节:

0x00操作成功

0x01坏的命令

0x02地址标记找不到

0x04记录找不到

0x05重置失败

0x07驱动参数活动失败

0x09企图DMA经过64K界限

0x0B检查坏的磁盘标记

0x10坏的ECC在磁盘上读

0x11ECC校正的数据错误(注意它不是错误)

0x20控制器失效

0x40查找失败

0x80响应的连接失败

0xBB出现无定义错误

0xFF读出操作失败

intbiodquip()检查设备,函数返回一字节,该字节每一位表示一个信息,如下:

第15位打印机号

第14位打印机号

第13位未使用

第12位连接游戏I/O

第11位RS232端口号

第8位未使用

第7位软磁盘号

第6位软磁盘号,

00为1号驱动器,01为2号驱动器,10为3号驱动器,11为4号驱动器

第5位初始化

第4位显示器模式

00为未使用,01为40x25BW彩色显示卡

10为80x25BW彩色显示卡,11为80x25BW单色显示卡

第3位母扦件

第2位随机存贮器容量,00为16K,01为32K,10为48K,11为64K

第1位浮点共用处理器

第0位从软磁盘引导

intbioskey(intcmd)本函数用来执行各种键盘操作,由cmd确定操作。

cmd可为以下值:

0返回敲键盘上的下一个键。若低8位为非0,即为ASCII字符;若低8位为0,

则返回扩充了的键盘代码。

1测试键盘是否可用于读。返回0表示没有键可用;否则返回下一次敲键之值。

敲键本身一直保持由下次调用具的cmd值为0的bioskey所返回的值。

2返回当前的键盘状态,由返回整数的每一个位表示,见下表:

┌──┬───────────┬───────────┐

│位│为0时意义│为1时意义│

├──┼───────────┼───────────┤

│7│插入状态│改写状态│

│6│大写状态│小写状态│

│5│数字状态,NumLock灯亮│光标状态,NumLock灯熄│

│4│ScrollLock灯亮│ScrollLock灯熄│

│3│Alt按下│Alt未按下│

│2│Ctrl按下│Ctrl未按下│

│1│左Shift按下│左Shift未按下│

│0│右Shift按下│右Shift未按下│

└──┴───────────┴───────────┘

intbiosmemory()返回内存大小,以K为单位.

intbiosprint(intcmd,intbyte,intport)控制打印机的输入/输出.

port为打印机号,0为LPT1,1为LPT2,2为LPT3等

cmd可以为以下值:

0打印字符,将字符byte送到打印机

1打印机端口初始化

2读打印机状态

函数返回值由以下位值组成表示当前打印机状态

0x01设备时间超时

0x08输入/输出错误

0x10选择的

0x20走纸

0x40认可

0x80不忙碌

intbiostime(intcmd,longnewtime)计时器控制,cmd为功能号,可为以下值

0函数返回计时器的当前值

1将计时器设为新值newtime

structcountry*country(intcountrycmode,structcountry*countryp)

本函数用来控制某一国家的相关信息,如日期,时间,货币等.

若countryp=-1时,当前的国家置为countrycode值(必须为非0).否则,由countryp

所指向的country结构用下列的国家相关信息填充:

(1)当前的国家(若countrycode为0或2)由countrycode所给定的国家.

结构country定义如下:

┌────────────────────┐

│structcountry│

│{│

│intco_date;/*日期格式*/│

│charco_curr[5];/*货币符号*/│

│charco_thsep[2];/*数字分隔符*/│

│charco_desep[2];/*小数点*/│

│charco_dtsep[2];/*日期分隔符*/│

│charco_tmsep[2];/*时间分隔符*/│

│charco_currstyle;/*货币形式*/│

│charco_digits;/*有效数字*/│

│int(far*co_case)();/*事件处理函数*/│

│charco_dasep;/*数据分隔符*/│

│charco_fill[10];/*补充字符*/│

│}│

└────────────────────┘

co_date的值所代表的日期格式是:

0月日年1日月年2年月日

co_currstrle的值所代表的货币显示方式是

0货币符号在数值前,中间无空格

1货币符号在数值后,中间无空格

2货币符号在数值前,中间有空格

3货币符号在数值后,中间有空格

操作函数,所在函数库为string.h、mem.h

mem…操作存贮数组

void*memccpy(void*destin,void*source,unsignedcharch,unsignedn)

void*memchr(void*s,charch,unsignedn)

void*memcmp(void*s1,void*s2,unsignedn)

intmemicmp(void*s1,void*s2,unsignedn)

void*memmove(void*destin,void*source,unsignedn)

void*memcpy(void*destin,void*source,unsignedn)

void*memset(void*s,charch,unsignedn)

这些函数,mem…系列的所有成员均操作存贮数组.在所有这些函数中,数组是n字节长.

memcpy从source复制一个n字节的块到destin.如果源块和目标块重迭,则选择复制方向,

以例正确地复制覆盖的字节.

memmove与memcpy相同.

memset将s的所有字节置于字节ch中.s数组的长度由n给出.

memcmp比较正好是n字节长的两个字符串s1和s2.些函数按无符号字符比较字节,因此,

memcmp(\"0xFF\",\"x7F\",1)返回值大于0.

memicmp比较s1和s2的前n个字节,不管字符大写或小写.

memccpy从source复制字节到destin.复制一结束就发生下列任一情况:

(1)字符ch首选复制到destin.

(2)n个字节已复制到destin.

memchr对字符ch检索s数组的前n个字节.

返回值:memmove和memcpy返回destin

memset返回s的值

memcmp和memicmp─┬─若s1

├─若s1=s2返回值等于0

└─若s1>s2返回值大于0

memccpy若复制了ch,则返回直接跟随ch的在destin中的字节的一个指针;

否则返回NULL

memchr返回在s中首先出现ch的一个指针;如果在s数组中不出现ch,就返回NULL.

voidmovedata(intsegsrc,intoffsrc,

intsegdest,intoffdest,

unsignednumbytes)

本函数将源地址(segsrc:offsrc)处的numbytes个字节

复制到目标地址(segdest:offdest)

voidmovemem(void*source,void*destin,unsignedlen)

本函数从source处复制一块长len字节的数据到destin.若源地址和目标地址字符串

重迭,则选择复制方向,以便正确的复制数据.

voidsetmem(void*addr,intlen,charvalue)

本函数把addr所指的块的第一个字节置于字节value中.

str…字符串操作函数

charstpcpy(char*dest,constchar*src)

将字符串src复制到dest

charstrcat(char*dest,constchar*src)

将字符串src添加到dest末尾

charstrchr(constchar*s,intc)

检索并返回字符c在字符串s中第一次出现的位置

intstrcmp(constchar*s1,constchar*s2)

比较字符串s1与s2的大小,并返回s1-s2

charstrcpy(char*dest,constchar*src)

将字符串src复制到dest

size_tstrcspn(constchar*s1,constchar*s2)

扫描s1,返回在s1中有,在s2中也有的字符个数

charstrdup(constchar*s)

将字符串s复制到最近建立的单元

intstricmp(constchar*s1,constchar*s2)

比较字符串s1和s2,并返回s1-s2

size_tstrlen(constchar*s)

返回字符串s的长度

charstrlwr(char*s)

将字符串s中的大写字母全部转换成小写字母,并返回转换后的字符串

charstrncat(char*dest,constchar*src,size_tmaxlen)

将字符串src中最多maxlen个字符复制到字符串dest中

intstrncmp(constchar*s1,constchar*s2,size_tmaxlen)

比较字符串s1与s2中的前maxlen个字符

charstrncpy(char*dest,constchar*src,size_tmaxlen)

复制src中的前maxlen个字符到dest中

intstrnicmp(constchar*s1,constchar*s2,size_tmaxlen)

比较字符串s1与s2中的前maxlen个字符

charstrnset(char*s,intch,size_tn)

将字符串s的前n个字符置于ch中

charstrpbrk(constchar*s1,constchar*s2)

扫描字符串s1,并返回在s1和s2中均有的字符个数

charstrrchr(constchar*s,intc)

扫描最后出现一个给定字符c的一个字符串s

charstrrev(char*s)

将字符串s中的字符全部颠倒顺序重新排列,并返回排列后的字符串

charstrset(char*s,intch)

将一个字符串s中的所有字符置于一个给定的字符ch

size_tstrspn(constchar*s1,constchar*s2)

扫描字符串s1,并返回在s1和s2中均有的字符个数

charstrstr(constchar*s1,constchar*s2)

扫描字符串s2,并返回第一次出现s1的位置

charstrtok(char*s1,constchar*s2)

检索字符串s1,该字符串s1是由字符串s2中定义的定界符所分隔

charstrupr(char*s)

将字符串s中的小写字母全部转换成大写字母,并返回转换后的字符串

存贮分配子程序,所在函数库为dos.h、alloc.h、malloc.h、stdlib.h、process.h

intallocmem(unsignedsize,unsigned*seg)利用DOS分配空闲的内存,

size为分配内存大小,seg为分配后的内存指针

intfreemem(unsignedseg)释放先前由allocmem分配的内存,seg为指定的内存指针

intsetblock(intseg,intnewsize)本函数用来修改所分配的内存长度,

seg为已分配内存的内存指针,newsize为新的长度

intbrk(void*endds)

本函数用来改变分配给调用程序的数据段的空间数量,新的空间结束地址为endds

char*sbrk(intincr)

本函数用来增加分配给调用程序的数据段的空间数量,增加incr个字节的空间

unsignedlongcoreleft()本函数返回未用的存储区的长度,以字节为单位

void*calloc(unsignednelem,unsignedelsize)分配nelem个长度为elsize的内存空间

并返回所分配内存的指针

void*malloc(unsignedsize)分配size个字节的内存空间,并返回所分配内存的指针

voidfree(void*ptr)释放先前所分配的内存,所要释放的内存的指针为ptr

void*realloc(void*ptr,unsignednewsize)改变已分配内存的大小,ptr为已分配有内

存区域的指针,newsize为新的长度,返回分配好的内存指针.

longfarcoreleft()本函数返回远堆中未用的存储区的长度,以字节为单位

voidfar*farcalloc(unsignedlongunits,unsignedlongunitsz)

从远堆分配units个长度为unitsz的内存空间,并返回所分配内存的指针

void*farmalloc(unsignedlongsize)分配size个字节的内存空间,

并返回分配的内存指针

voidfarfree(voidfar*block)释放先前从远堆分配的内存空间,

所要释放的远堆内存的指针为block

voidfar*farrealloc(voidfar*block,unsignedlongnewsize)改变已分配的远堆内

存的大小,block为已分配有内存区域的指针,newzie为新的长度,返回分配好

的内存指针

时间日期函数,函数库为time.h、dos.h

在时间日期函数里,主要用到的结构有以下几个:

总时间日期贮存结构tm

┌──────────────────────┐

│structtm│

│{│

│inttm_sec;/*秒,0-59*/│

│inttm_min;/*分,0-59*/│

│inttm_hour;/*时,0-23*/│

│inttm_mday;/*天数,1-31*/│

│inttm_mon;/*月数,0-11*/│

│inttm_year;/*自1900的年数*/│

│inttm_wday;/*自星期日的天数0-6*/│

│inttm_yday;/*自1月1日起的天数,0-365*/│

│inttm_isdst;/*是否采用夏时制,采用为正数*/│

│}│

└──────────────────────┘

日期贮存结构date

┌───────────────┐

│structdate│

│{│

│intda_year;/*自1900的年数*/│

│charda_day;/*天数*/│

│charda_mon;/*月数1=Jan*/│

│}│

└───────────────┘

时间贮存结构time

┌────────────────┐

│structtime│

│{│

│unsignedcharti_min;/*分钟*/│

│unsignedcharti_hour;/*小时*/│

│unsignedcharti_hund;│

│unsignedcharti_sec;/*秒*/│

││

└────────────────┘

char*ctime(long*clock)

本函数把clock所指的时间(如由函数time返回的时间)转换成下列格式的

字符串:MonNov2111:31:541983n0

char*asctime(structtm*tm)

本函数把指定的tm结构类的时间转换成下列格式的字符串:

MonNov2111:31:541983n0

doubledifftime(time_ttime2,time_ttime1)

计算结构time2和time1之间的时间差距(以秒为单位)

structtm*gmtime(long*clock)本函数把clock所指的时间(如由函数time返回的时间)

转换成格林威治时间,并以tm结构形式返回

structtm*localtime(long*clock)本函数把clock所指的时间(如函数time返回的时间)

转换成当地标准时间,并以tm结构形式返回

voidtzset()本函数提供了对UNIX操作系统的兼容性

longdostounix(structdate*dateptr,structtime*timeptr)

本函数将dateptr所指的日期,timeptr所指的时间转换成UNIX格式,并返回

自格林威治时间1970年1月1日凌晨起到现在的秒数

voidunixtodos(longutime,structdate*dateptr,structtime*timeptr)

本函数将自格林威治时间1970年1月1日凌晨起到现在的秒数utime转换成

DOS格式并保存于用户所指的结构dateptr和timeptr中

voidgetdate(structdate*dateblk)本函数将计算机内的日期写入结构dateblk

中以供用户使用

voidsetdate(structdate*dateblk)本函数将计算机内的日期改成

由结构dateblk所指定的日期

voidgettime(structtime*timep)本函数将计算机内的时间写入结构timep中,

以供用户使用

voidsettime(structtime*timep)本函数将计算机内的时间改为

由结构timep所指的时间

longtime(long*tloc)本函数给出自格林威治时间1970年1月1日凌晨至现在所经

过的秒数,并将该值存于tloc所指的单元中.

intstime(long*tp)本函数将tp所指的时间(例如由time所返回的时间)

写入计算机中.

附录资料:不需要的可以自行删除

SHA算法的实现

C语言程序:

#include

#include//定义vector数组

#include//记录消息

usingnamespacestd;

constintNUM=8;//一个字由32比特(或者8个16进制数)

constintBIT=512;//消息认证码要以512比特一组

//字常量

stringH0=\"67452301\";

stringH1=\"EFCDAB89\";

stringH2=\"98BADCFE\";

stringH3=\"10325476\";

stringH4=\"C3D2E1F0\";

//定义SHA1(安全哈希算法)类

classSHA1

{

public:

//将一个字符串形式的字转化为vector数组

vectorhex_into_dec(stringword);

//将vector转化为string字符串形式

stringnum_into_message(vectorA);

//两个字X和Y的逻辑\"和\"

vectorword_AND(vectorA,vectorB);

//两个字X和Y的逻辑\"或\"

vectorword_OR(vectorA,vectorB);

//两个字X和Y的逻辑\"异或\"

vectorword_XOR(vectorA,vectorB);

//两个字X和Y的逻辑\"补\"

vectorword_COMPLEMENT(vectorA);

//两个字X和Y的摸2^32整数加

vectorword_ADD(vectorA,vectorB);

//将字X循环左移s个位置

vectorROTL(vectorA,ints);

//SHA-1的填充方案,我们设定msg由ASCII码组成

vector>SHA_1_PAD(stringmsg);

//将SHA-1压成以字为单位

vector>>compress(vector>result);

//定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作

为输出

vectorFt(intt,vectorB,vectorC,vectorD);

//定义字常数K

vectorK(intt);

//开始进行SHA-1(安全Hash算法)的加密

vector>SHA_1(stringmsg);

};

//将vector转化为string字符串形式

stringSHA1::num_into_message(vectorA)

{

inti;

stringmsg=\"\";

for(i=0;i<();i++)

{

if(A[i]>=0&&A[i]<=9)

msg+=\'0\'+A[i];

elseif(A[i]>=10&&A[i]<=15)

msg+=\'A\'+(A[i]-10);

}

returnmsg;

}

//将一个字符串形式的字转化为vector数组

vectorSHA1::hex_into_dec(stringword)

{

inti;

vectorresult(NUM,0);

for(i=0;i

{

if(word[i]>=\'0\'&&word[i]<=\'9\')

{

result[i]=word[i]-\'0\';

}

elseif(word[i]>=\'A\'&&word[i]<=\'F\')

{

result[i]=10+word[i]-\'A\';

}

}

returnresult;

}

//两个字X和Y的逻辑\"和\"

vectorSHA1::word_AND(vectorA,vectorB)

{

vectorresult(NUM,0);

inti;

for(i=0;i

{

result[i]=A[i]&B[i];

}

returnresult;

}

//两个字X和Y的逻辑\"或\"

vectorSHA1::word_OR(vectorA,vectorB)

{

vectorresult(NUM,0);

inti;

for(i=0;i

{

result[i]=A[i]|B[i];

}

returnresult;

}

//两个字X和Y的逻辑\"异或\"

vectorSHA1::word_XOR(vectorA,vectorB)

{

vectorresult(NUM,0);

inti;

for(i=0;i

{

result[i]=A[i]^B[i];

}

returnresult;

}

//两个字X和Y的逻辑\"补\"

vectorSHA1::word_COMPLEMENT(vectorA)

{

vectorresult(NUM,0);

inti;

for(i=0;i

{

result[i]=15-A[i];

}

returnresult;

}

//两个字X和Y的摸2^32整数加

vectorSHA1::word_ADD(vectorA,vectorB)

{

vectorresult(NUM,0);

inti;

for(i=NUM-1;i>=0;i--)

{

result[i]=A[i]+B[i];

if(i!=0)

{

inttemp=result[i]/16;

result[i-1]+=temp;

}

result[i]%=16;

}

returnresult;

}

//将字X循环左移s个位置

vectorSHA1::ROTL(vectorA,ints)

{

vectorresult=A;

vectortemp(NUM,0);

inti,j;

for(i=0;i

{

for(j=NUM-1;j>=0;j--)

{

if(result[j]/8>=1)

{

temp[j]=1;

result[j]<<=1;

result[j]%=16;

if(j

result[j]+=temp[j+1];

}

elseif(result[j]/8==0)

{

temp[j]=0;

result[j]<<=1;

result[j]%=16;

}

}

result[NUM-1]+=temp[0];

}

returnresult;

}

//SHA-1的填充方案,我们设定msg由ASCII码组成

vector>SHA1::SHA_1_PAD(stringmsg)

{

intlen=();

intbit_num=len*8;

inti,j;

intnum,lest=bit_num%512;

if(lest!=0)//看消息长度是否超过512字节,我们需要将它补成512的倍

num=bit_num/512+1;

else

num=bit_num/512;

//首先我们以8位字节为一组保存到vector里面,512比特为一组,即一组

里面有64位元素

vector>result;

(num);

for(i=0;i

{

result[i].resize(64);

}

for(i=0;i

{

for(j=0;j<64&&i*64+j

{

result[i][j]=msg[i*64+j];

}

}

//下面开始为未够512比特的消息分组进行补长度操作

if(lest!=0){

intx=num-1,last_len=lest/8;

result[x][last_len]=128;//先补一个\"1\"

for(i=last_len+1;i<56;i++)

{

result[x][i]=0;

}

intlast_l=lest;

j=63;

while(j>=56)

{

result[x][j]=last_l%128;

last_l/=128;

j--;

}

}

returnresult;

}

//将SHA-1压成以字为单位(三维数组有点复杂)

vector>>SHA1::compress(vector>result)

{

vector>rr;

(());

inti,j;

for(i=0;i<();i++)

{

rr[i].resize(128);

}

for(i=0;i<();i++)

{

for(j=0;j

{

rr[i][2*j]=result[i][j]/16;

rr[i][2*j+1]=result[i][j]%16;

}

}

vector>>rrr;

(());

for(i=0;i<();i++)

{

rrr[i].resize(16);

}

for(i=0;i<();i++)

{

for(j=0;j<16;j++)

{

rrr[i][j].resize(8);

}

}

for(i=0;i<();i++)

{

for(j=0;j

{

rrr[i][j/8][j%8]=rr[i][j];

}

}

returnrrr;

}

//定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输

vectorSHA1::Ft(intt,vectorB,vectorC,vectorD)

{

vectorresult;

if(t>=0&&t<=19)

{

vectora1=word_AND(B,C);

vectora2=word_AND(word_COMPLEMENT(B),D);

result=word_OR(a1,a2);

}

elseif((t>=20&&t<=39)||(t>=60&&t<=79))

{

vectora1=word_XOR(B,C);

result=word_XOR(a1,D);

}

elseif(t>=40&&t<=59)

{

vectora1=word_AND(B,C);

vectora2=word_AND(B,D);

vectora3=word_AND(C,D);

vectora4=word_OR(a1,a2);

result=word_OR(a4,a3);

}

returnresult;

}

//定义字常数K

vectorSHA1::K(intt)

{

vectorresult;

if(t>=0&&t<=19)

{

result=hex_into_dec(\"5A827999\");

}

elseif(t>=20&&t<=39)

{

result=hex_into_dec(\"6ED9EBA1\");

}

elseif(t>=40&&t<=59)

{

result=hex_into_dec(\"8F1BBCDC\");

}

elseif(t>=60&&t<=79)

{

result=hex_into_dec(\"CA62C1D6\");

}

returnresult;

}

//开始进行SHA-1(安全Hash算法)的加密

vector>SHA1::SHA_1(stringmsg)

{

vectorh0=hex_into_dec(H0);

vectorh1=hex_into_dec(H1);

vectorh2=hex_into_dec(H2);

vectorh3=hex_into_dec(H3);

vectorh4=hex_into_dec(H4);

vector>result1=SHA_1_PAD(msg);

vector>>result2=compress(result1);

intn=();

inti,j;

for(i=0;i

{

vector>W;

(80);

for(j=0;j<16;j++)

{

W[j]=result2[i][j];

}

for(j=16;j<80;j++)

{

vectora1=word_XOR(W[j-3],W[j-8]);

vectora2=word_XOR(a1,W[j-14]);

vectora3=word_XOR(a2,W[j-16]);

W[j]=ROTL(a3,1);

}

//将string转化为vector数组

vectorA=hex_into_dec(H0);

vectorB=hex_into_dec(H1);

vectorC=hex_into_dec(H2);

vectorD=hex_into_dec(H3);

vectorE=hex_into_dec(H4);

for(j=0;j<80;j++)

{

vectora1=ROTL(A,5);

vectora2=Ft(j,B,C,D);

vectora3=word_ADD(a1,a2);

vectora4=word_ADD(a3,E);

vectora5=word_ADD(a4,W[j]);

vectortemp=word_ADD(a5,K(j));

E=D;

D=C;

C=ROTL(B,30);

B=A;

A=temp;

}

h0=word_ADD(h0,A);

h1=word_ADD(h1,B);

h2=word_ADD(h2,C);

h3=word_ADD(h3,D);

h4=word_ADD(h4,E);

}

//返回结果(H0||H1||H2||H3||H4)

vector>result;

_back(h0);

_back(h1);

_back(h2);

_back(h3);

_back(h4);

returnresult;

}

intmain()

{

SHA1sha1;//定义SHA1算法类

stringmessage=

\"cryptographyisthepracticeandstudyoftechniquesforsecurecommunicationinthepresenc

eofthirdpartiesmoregenerallyitisaboutconstructingandanalyzingprotocolsthatovercome

theinfluenceofadversariesandwhicharerelatedtovariousaspectsininformationsecuritysu

chasdataconfidentialitydataintegrityauthenticationandnonrepudiationmoderncryptogra

phyintersectsthedisciplinesofmathematicscomputerscienceandelectricalengineeringap

plicationsofcryptographyincludeATMcardscomputerpasswordsandelectroniccommerc

e\";

vector>result;

result=_1(message);

cout<<\"消息为:\"<

cout<<\"利用填充方案SHA-1-PAD给出对消息的填充,得出SHA-1(x)得:\"<<

endl;

inti;

for(i=0;i<();i++)

{

cout<<_into_message(result[i]);

}

cout<

return0;

}

程序运行结果:

更多推荐

standardpartlibrary是什么意思ndardpartlibrary