《C语言编程技巧》由会员分享,可在线阅读,更多相关《C语言编程技巧(30页珍藏版)》请在人人文库网上搜索。
1、C语言编程常见问题解答之常用函数的包含文件(1)-函数 包含 类别 功能_atold math.h 数学子程序 把字符串转换为浮点数_beginthread process.h 进程控制子程序 启动执行一个新线程_bios_disk bios.h 接口子程序 输出BIOS磁盘驱动器服务_bios_equiplist bios.h 接口子程序 检查设备_bios_keybrd bios.h 接口子程序 直接使用BIOS的键盘接口_bios_memsize biosd.h 存储子程序 返回内存大小_bios_printer bios.h 接口子程序 直接调用BIOS服务进行打印机I/O_bios_。
2、timeofday bios.h 时间和日期子程序 读取或设置BIOS时钟_biosserialcom bios.h 接口子程序 进行串行I/O_c_exit process.h 进程控制子程序 不终止程序执行如同_exit的清除_cexit process.h 进程控制子程序 不终止程序执行如同_exit的清除_chdrive direct.h 目录控制子程序 设置当前驱动器_chian_intr dos.h 接口子程序_chmode io.h 输入输出子程序 改变文件的存取权限_clear87 float.h 数学子程序 清除浮点状态字_close io.h 输入输出子程序 关闭文件(3。。
3、1)以下版本_control87 float.h 数学子程序 处理浮点控制字_creat io.h 输入输出子程序 创建一个新文件或重写一个已存在的文件_disable dos.h 接口子程序 屏蔽中断_dos_allocmem dos.h 存储子程序_dos_close dos.h 输入输出子程序 关闭一个文件_dos_craete dos.h 输入输出子程序 创建一个新文件或重写一个已存在的文件_dos_createnew dos.h 输入输出子程序 创建一个新文件_dos_findfirst dos.h 目录控制子程序 搜索一个磁盘目录_dos_findnext dos.h 目录控制子程。
4、序 继续_dos_findfirst的搜索_dos_freemem dos.h 存储子程序_dos_getdate dos.h 时间和日期子程序 取得和设置系统日期_dos_getdiskfre dos.h 目录控制子程序 取得磁盘空闲空间_dos_getdrive dos.h 目录控制子程序 取得和设置当前驱动器号_dos_getfileatt dos.h 输入输出子程序 取得和设置文件属性_dos_getftime dos.h 输入输出子程序 取得和设置文件日期和时间_dos_gettime dos.h 时间和日期子程序 取得和设置系统时间_dos_getvect dos.h 接口子程序 。
5、取得中断向量_dos_keep dos.h 接口子程序_dos_open dos.h 输入输出子程序 打开一个文件用于读和写_dos_read dos.h 输入输出子程序 从文件读_dos_setblock dos.h 存储子程序_dos_setdate dos.h 时间和日期子程序 设置系统日期精品._dos_setdrive dos.h 目录控制子程序 设置当前驱动器号_dos_setfileatt dos.h 输入输出子程序 设置文件属性_dos_setfitme dos.h 输入输出子程序 设置文件时间_dos_settime dos.h 时间和日期子程序 设置系统时间_dos_set。
6、vect dos.h 接口子程序 设置中断向量_dos_write dos.h 输入输出子程序 写向文件_enable dos.h 接口子程序 开硬件中断_exit process.h 进程控制子程序 终止程序_fpresent float.h 数学子程序 重新初始化浮点数学包_fsopen stdio.h 输入输出子程序_fullpath stdlib.h 目录控制子程序 把相对路径名转换为绝对路径名_getdcwd direct.h 目录控制子程序 取得指定驱动器的当前目录_getdrive direct.h 目录控制子程序 取得当前驱动器号_graphfreemem graphics.h。
7、 图形子程序 可修改的图形内存释放函数_graphgetmem graphics.h 图形子程序 可修改的图形内存分配函数_harderr dos.h 接口子程序 建立一个硬件错误处理程序_hardresume dos.h 接口子程序 硬件错误处理函数_hardretn dos.h 接口子程序 硬件错误处理函数_heapadd alloc.h 添加一个块到堆上_heapmin malloc.h 释放无用的堆区域_hea视频教程pset malloc.h 用一个常量值填充堆上的自由块_initEasyWin io.h 初始化Ease windows_lrotl stdlib.h 数学子程序 将无。
8、符号长整型数向左循环移位_lrotr stdlib.h 数学子程序 将无符号长整型数向右循环移位_makeepath stdlib.h 目录控制子程序 生成一个路径_matherrl math.h 诊断子程序 用户可修改的数学错误处理程序_matherrl math.h 数学子程序 用户可修改的数学错误处理程序_open io.h 输入输出子程序 打开一个文件进行读和写_OvrInitEms dos.h 初始化复盖治理程序用于交换EMS内存_OvrInitExt dos.h 初始化复盖治理程序用于交换EXT内存_pclose stdio.h 等待一个管道命令结束_popen stdio.h 创。
9、建一个子命令处理程序管道_read io.h 输入输出子程序 读文件(3。1以下版本)_rotl stdlib.h 嵌入子程序 将一个无符号整数左循环移位_rotl stdlib.h 数学子程序 把一个无符号整数左循环移位_rotr stdlib.h 嵌入子程序 将一个无符号整数向左循环移位_searchstr stdlib.h 为某文件查找某些目录_setcursortype graphics.h 图形子程序 选择光标类型_setcursortype conio.h 输入输出子程序 选择光标类型_setcursortype conio.h 文本窗口显示子程 选择光标类型_splitpath 。
10、stdlib.h 目录控制子程序 将一个全限定的路径名分解各个成份_status87 float.h 数学子程序 取浮点状态_strdate stdlib.h 转换子程序 把当前日期转换成字符串精品._strerror string.h stdio 输入输出子程序 建立用户定义的错误信息_strtime stdlib.h 转换子程序 转换当前日期为字符串_strtold stdlib.h 转换子程序_strtold stdlib.h 数学子程序_tolower ctype.h 转换子程序 把字符转换成小写字母_write io.h 输入输出子程序 写文件abort process.h 进程控制。
11、子程序 异常终止一进程abs stdlib.h compl 数学子程序 返回整数的绝对值absl math.h 数学子程序 计算复数的模absread dos.h 接口子程序 读磁盘的绝对扇区abswrite dos.h 接口子程序 写磁盘的绝对扇区access io.h 输入输出子程序 确定文件的存取权限acos math.h complex 数学子程序 计算反余弦值acosl math.h 数学子程序 计算反余弦值alloca malloc.h 存储子程序 分配临时堆栈空间allocm dos.h 存储子程序 分配DOS内存arc graphics.h 图形子程序 画园弧arg compl。
12、ex.h 数学子程序 求复平面中一个复数的弧度asctime time.h 时间和日期子程序 转换日期和时间为对应的ASCII码asin math.h complex 数学子程序 反正弦函数asinl math.h 数学子程序 反正弦函数assert assert.h 诊断子程序 条件终止函数atan2 math.h complex 数学子程序 计算y/x的反正切值atan2l math.h 数学子程序 计算y/x的反正切值atof stdlib.h 转换子程序 将字符串转换为浮点数at of math.h stdlib. 数学子程序 将字符串转换成浮点数atoi stdlib.h 转换子程序。
13、 将字符串转换为整数atoi stdlib.h 数学子程序 把字符串转换成整型数atol stdlib.h 转换子程序 将字衔串转换成长整型数atol stdlib.h 数学子程序 抬字符串转换为长整型bar graphics.h 图形子程序 画二维条形图bar3d graphics.h 图形子程序 画一个三维条形图bcd bcd.h 数学子程序 把一个数转换为相对应的BCD码bdos dos.h 接口子程序 DOS系统调用bdosptr dos.h 接口子程序 DOS系统调用bioscom bios.h 接口子程序 I/O通讯biosdisk bios.h 接口子程序 调用BIOS磁盘驱动程。
14、序bioseqiplist bios.h 接口子程序 检查设备bioskey bios.h 接口子程序 调用BIOS的键盘接口biosmemory bios.h 接口子程序 返加内存的大小biosprintf bios.h 接口子程序 调用BIOS的打印I/O接口biostime bios.h 接口子程序 读取或设置BIOS时钟brk alloc.h 存储子程序 改变数据段内存分配cabs math.h 数学子程序 计算复数的模精品.calloc alloc.h stdlib 存储子程序 分配内存ceil math.h 数学子程序 舍入ceill math.h 数学子程序 舍入cgets co。
15、nio.h 输入输出子程序 读字符串chdir dir.h 目录控制子程序 改变当前目录chmod io.h 输入输出子程序 改变文件存取权限chsize io.h 输入输出子程序 修改文件长度circle graphics.h 图形子程序 画园cleardevice graphics.h 图形子程序 清图形屏幕clearerr io.h 输入输出子程序 复位错误标志clearviewport graphics.h 图形子程序 清除当前图形窗口close io.h 输入输出子程序 关闭文件closedir direct.h 目录控制子程序 关闭目录流closegraph graphics.h 。
16、图形子程序 关闭图形系统clreol conio.h 文本窗口显示子程 清除从当前光标位置到行尾的字符clrscr conio.h 文本窗口显示子程 清除文本窗口,并把光标放在左上角complex complex.h 数学子程序 创建复数conj complex.h 数学子程序 求复数的共轭复数coreleft alloc.h stdlib 存储子程序 返顺未使用的内存大小cos math.h complex 数学子程序 计算余弦值cosh math.h complex 数学子程序 计算双曲余弦值coshl math.h 数学子程序 计算双曲余弦值cosl math.h 数学子程序 计算余弦值。
17、country dos.h 接口子程序 读取与特定国家有关的格式cprintf conio.h 输入输出子程序 格式化并输出数据到屏幕cputs conio.h 输入输出子程序 输出一字符串到屏幕creat io.h 输入输出子程序 创建一个新文件或重写一个已存在的文件creatnew io.h 输入输出子程序 创建新文件creattemp io.h 输入输出子程序 创建一个文件名唯一的文件cscanf conio.h 输入输出子程序 从控制台执行格式化输入ctime time.h 时间和日期子程序 把日期和时间转化为对应的字符串ctrlbrk dos.h 接口子程序 设置CTRL-BREAK。
18、处理程序delay dos.h 杂类子程序 暂停DOSdelline conio.h 文本窗口显示子程 在文本窗口中删去一行detectgraph graphics.h 图形子程序 检测硬件并确定使用何种图形驱运程序和图形difftime time.h 时间和日期子程序 计算二个时刻的时间差disable dos.h 接口子程序 屏蔽中断css.shtml target=_blank title = div视频教程div math.h 数学子程序 将二个整数相除,返回商和余数dosexterr dos.h 接口子程序 获取扩展错误信息dostounix dos.h 时间和日期子程序 把日期和时。
19、间转换成UNIX格式drawpoly graphics.h 图形子程序 绘制多边形精品.dup io.h 输入输出子程序 复制文件句柄dup2 io.h 输入输出子程序 将一个文件句柄复制到一个已有的文件句柄ecvt stdlib.h 转换子程序 把浮点数转换成字符串ecvt stdlib.h 数学子程序 把浮点数转换为字符串elipse graphics.h 图形子程序 绘制椭园enable dos.h 接口子程序 开硬件中断eof io.h 输入输出子程序 检测文件是否结束execle process.h 进程控制子程序 装入并运行其它程序execlp process.h 进程控制子程序 。
20、装入并运行其它程序execlpe process.h 进程控制子程序 装入并运行其它程序exect process.h 进程控制子程序execv process.h 进程控制子程序 装入并运行其它程序 本文章来自www.21shipin.com 21视频教程网 C语言编程常见问题解答之常用函数的包含文件(1)_C语言程序设计教程 原文链接:http:/www.21shipin.com/html/61353.shtmlC语言编程常见问题解答之杂项(Miscellaneous)(2)-请参见:2012怎样把数据从一个程序传递到另一个程序?2017可以使热启动(Ctrl+Alt+Delete)失效吗。
21、?2110什么是动态连接?209 为什么要使用静态变量静态变量作为一个局部变量是很合适的,它在函数退出后不会失去其本身的值。例如,有一个要被调用很多次的函数,它的一部分功能就是计算自己被调用的次数。你不能用一个简单的局部变量来实现这部分功能,因为每次进入该函数时,这个变量都没有被初始化。假如把这个计数变量说明为静态的,那么它就会象一个全局变量那样保留自己的当前值。那么为什么不直接使用一个全局变量呢?你可以使用一个全局变量,而且这样做没有错误。问题是使用了大量全局变量的程序维护起来很麻烦,尤其是有许多函数都各自访问一个全局变量的程序。再说一遍,这样做没有错误,这只是一个程序设计和可读性是否好的问。
22、题。假如你把这样的变量说明为静态的,你就可以提醒自己(或者其它可能读你的程序的人)它是局部变量,但要象全局变量那样被处理(保留自己的值)。假如你把它说明为全局的,那么读这个程序的人一定会认为有很多地方要引用它,尽管实际上并不是这样。总而言之,当你需要一个能保持自己的值的局部变量时,使用静态变量是一种好的编程习惯。请参见:217可以头文件中说明static变量吗?2010 怎样在一个程序后面运行另一个程序?显然,在一个程序后面运行另一个程序的最简单的办法是把它们依次列入一个批处理文件中,在执行该批处理文件时,其中所列的程序就会依次运行。然而,这是一种人们已经知道的办法。在c或DOS中,都没有一种。
23、特定的方法来完成“在一个程序结束后运行另一个程序”这样一种函数调用。然而,c提供了两组函数,它们答应一个程序随时可以运行另一个程序,而后者的运行将结束前者的运行。假如你将这样的一个函数调用放到第一个程序的末尾,你就能达到上述目的。C所提供的这两组函数实际上是由exec()和spawn()所代表的两个函数族,其中的每一个函数都具有一种区别于同族其它函数的功能。exec()函数族包括这样一些成员:execl(),execle(),execlp(),execlpe(),execv(),execve(),execvp()和execvpe()。下面列出了这此函数名中的e,l,p和v等后缀的含义:精品.e。
24、 明确地把一个指向环境参数的指针数组传递给子进程l 把命令参数逐个传递给要执行的程序p 通过环境变量PATH找到要执行的文件v 把命令行参数以一个指针数组的形式传递给要执行的程序在程序中选用哪一个函数完全取决于你以及要执行的程序的需要。下例中的程序调用了其参数由命令行指定的另一个程序:# include # include char * envString = / * environment for the app * /COMM VECTOR=0x63, /* communications vector */PARENT=LAUNCH. EXE, / * name of this app *。
25、 /EXEC=EDIT. COM, / * name of app to exec * /NULL ; / * must be NULL-terminated * /voidmain(int argc, char *argv)/ * Call the one with variable argumets and an enviroffment * /_execvpe ( EDIT. COM, argv, envString ) ;printf(If you can read this sentence, the exec didnt happen!n) ;上面这个短小的例子调用_execvpe。
26、()来执行DOS的文件编辑器EDITCOM,EDIT程序的参数来自该例的命令行。在调用execvpe()函数后,上例中的程序就结束了;当EDIT程序退出时,你将返回到DOS提示符。假如printf()语句的打印内容显示在屏幕上,则说明_execvpe()函数调用出了问题,因为假如它调用成功,就不会有上述结果。注重,上例所提供的EDIT.COM的环境变量是没有任何意义的,然而,假如上例要执行一个需要环境变量的程序,那么所提供的环境变量就能供该程序使用了。用spawn()函数同样可以完成上例所做的工作。spawn()函数族包括这样一些成员:spawnl(),spawnle()。spawnlp(),。
27、spawnlpe(),spawnv(),spawnve(),spawnvp()和spawnvpe()。这些函数名中的e,l,p和v等后缀的含义与exec()族函数名中的相同。实际上,spawn()函数族与exec()函数族基本相同,只不过有一点小小的差别spawn()函数既可以在结束原来的程序后启动另一个程序,也可以启动另一个程序并在该程序结束后返回到原来的程序。spawn()函数的参数与exec()函数的基本相同,只不过需要增加一个参数一你必须用_P_OVERLAY(结束原来的程序)或_P_WAIT(结束后返回到原来的程序)作为spawn()函数的第一个参数。下例用spawn()函数完成了与。
28、前面的例子相同的工作:# include # include char * envString = / * environment for the app * /COMM VECTOR = 0x63, / * communications vector * /精品.PARENT=LAUNCH. EXE, / * name of this app * /EXEC=EDIT. COM , / * name of app to exec * /NULL ; / * must be NULL-terminated * /voidmain(int argc, char *argv)/ * Call th。
29、e one with variable argumets and an environment * /_spawnvpe (_P_OVERLAY, EDIT. COM, argv, envString) ;printf(If you can read this sentence, the exec didnt happen!n );这里唯一的区别是exec”变为spawn,并且增加了模式(mode)参数。spawn()函数有覆盖和等待两种相对立的功能,它使你可以在spawn()运行期间做出是等待还是离开的决定。实现上,P_WAIT参数回答了下一个问题。请参见:2011 怎样在一个程序执行期间运。
30、行另一个程序?2011 怎样在一个程序执行期间运行另一个程序?正如你在2010的例子中看到的那样,spawn()函数族答应在一个程序中启动另一个程序,并在后者结束后返回到前者之中。有关spawn()函数的背景知识和例子(你只需把其中的_P_OVERLAY改为_P_WAIT) 请参见2010。然而,还有另外一种方法可以完成这项工作,即使用system()函数。system()函数与exec()或spawn()函数相似,但也不有同之处。除了挂起(而不是结束)当前程序去执行新程序外,system()还要启动COMMANDCOM命令翻译程序(或者其它任何运行在你的计算机上的命令翻译程序)。假如它找不到。
31、COMMANDCOM或类似的程序,那么它就不会去执行所要求的程序(这一点与exec()或spawn()函数不同)。下例是调用EDITCOM打开一个文件的另一个程 序版本,其中的文件名也来自该例的命令行:# include # include # inclued char argStr255 ;voidmain(int argc, char *argv)int ret ;/ * Have EDIT open a file called HELLO if no arg given * /sprintf (argStr ,EDIT %s, (argv1 = NULL?HELLO :argyll3) 。
32、) ;/ * Call the one with variable arguments and an environment * /ret = sytem (argStr) ;printf(system() returned %dn ,ret) ;与2010中的例子一样(使用_P_WAIT),在system()调用后面的print()语句会被执行,因为原来的程序只是被挂起而不是被终止。在每一种情况下,system()都会返回一个表示是否成功地运行了所指定的程序的值,而不会返回所指定的程序的返回值。精品.请参见:2010怎样在一个程序后面运行另一个程序?2012 怎样把数据从一个程序传给另一个程。
33、序?有好几种基本的方法可以完成这项任务-你可以通过文件或内存来传递这些数据。这些方法的步骤都相当简洁:首先,定义在何处存放数据,如何获取数据,以及如何通知另一个程序来获取或设置数据;然后,你就可以获取或设置数据了,尽管使用文件的技术定义和实现起来都比较简单,但它的速度往往比较慢(并且轻易引起混乱)。因此,这里重点讨论内存数据转移技术。下面将依次具体地分析这一过程的每一个环节:定义在何处存放数据。当你编写要共享数据的两个程序时,你应该让程序知道要访问的数据存放在何处。这个环节同样有几种实现方法:你可以在一个(或每个)程序中建立一个固定的内部缓冲区,并在两个程序之间传递指向这个缓冲区的指针;你也可。
34、以为数据分配动态内存,并在两个程序之间传递指向该数据的指针;假如要传递的数据很小,你还可以通过CPU的通用寄存器来传递数据(这种可能性很小,因为x86结构的寄存器很少)。分配动态内存是最灵活和模块性最强的方法。定义获取数据的方法。这个环节非常简洁你可以使用fmemcpy()或等价的内存拷贝函数。显然,在获取和设置数据时都可以使用这个函数。定义通知另一个程序的方法。因为DOS并不是一个多任务操作系统,所以其中一个(或两个)程序的一部分必须已经驻留在内存中,并且可以接受来自另一个程序的调用。同样,这个环节也有几种方法可供选择:第一个程序可以是一个列入CONFIGSYS中的驱动程序,它在系统启动时就。
35、被装入内存;第一个程序也可以是一个TSR(终止并驻留)程序,在它退出时会把与第二个程序相互作用的那部分程序驻留在内存中;此外,你也可以在第一个程序中利用system()或spawn()函数(见2011)来启动第二个程序。你可以根据需要选择合适的方法。因为有关DOS驱动程序的数据传递在DOS文档中已经有详尽的描述,而有关system()和spawn()函数的内容也已经在前文中介绍过,因此下面介绍TSR方法。下面的例子给出了两个程序:第一个程序是一个完整的TSR程序,但为了突出整个过程中的要害环节,它写得比较单薄(见2015中的解释)。这个TSR程序先是安装了一个中断63H的中断服务程序,然后调用。
36、终止并驻留退出函数,在执行这个TSR程序后,执行下文给出的另一个程序。这个程序只是简单地初始化一个对中断63H的调用(类似于使用中断21H调用),并且把“Hello There”传送给上述TSR程序# include # include # include void SetupPointers (void) ;void OutputString(char * );# define STACKSIZE 4096unsigned int near OldStackPtr;unsigned int near OldStackSeg;unsigned int _near MyStackOff ;uns。
37、igned int _near MyStackSeg;unsigned char_near MyStackSTACKSIZE;unsigned char far * MyStackPtr= (unsigned char_far * )MyStack;unsigned short AX, BX,CX, DX,ES;/ * My interrupt handler * /void_interrupt_far_视频教程cdecl NewCommVector (精品.unsigned short es, unsigned short ds, unsigned short di,unsigned sho。
38、rt si, unsigned short bp, unsigned short sp,unsigned short bx, unsigned short dx, unsigned short cx,unsigned short ax, unsigned short ip, unsigned short cs,unsigned short flags) ;/ * Pointers to the previous interrupt handier * /void(_interrupt_far_cdecl * CommVector)();union REGS regs;struet SREGS 。
39、segregs ;# define COMM_VECTOR 0x63 / * Software interrupt vector * / * This is where the data gets passed into the TSR * /char_far * eallerBufPtr;char localBuffer255; / * Limit of 255 bytes to transfer * /char_far * localBufPtr=(ehar_far * )loealBuffer;unsigned int ProgSize= 276; / * Size of the pro。
40、gram in paragraphs * /voidmain(int argc,char * * argv)int i, idx;/ * Set up all far pointers * /SetupPointers () ;/ * Use a cheap hack to see if the TSR is already loadedtf it is, exit,doing nothing * /comm_veetor =_dos_getvect (COMM_VECTOR) ;if(long)eomm_vector & 0xFFFFL) =(long) NewCommVector & Ox。
41、FFFFL ) ) OutputString(Error :TSR appears to already be loaded. n);return ;/ * If everythings set,then chain in the TSR * /_dos_setvect (COMM_VECTOR ,NewCommVector) ;/ * Say we are loaded * /OutputString(TSR is now loaded at 0x63n);/ * Terminate, stay resident * /dos_keep (0, ProgSize ) ;/ * Initial。
42、izes all the pointers the program will use * /voidSet upPointers ( )int idx ;/ * Save segment and offset of MyStackPtr for stack switching * /MyStackSeg = FP_SEG (MyStackPtr) ;MyStackOff = FP_OFF (MyStackPtr) ;/ * Initialize my stack to hex 55 so I can see its footprint精品.if I need to do debugging *。
43、 /for (idx = 0 ;idxSTACKSIZE ; idx + ) MyStack idx = 0x55 ;void _interrupt_ far_cdecl NewCommVector (unsigned short es, unsigned short ds, unsigned short di,unsigned short si, unsigned short bp, unsigned short sp,unsigned short bx, unsigned short dx, unsigned short cx,unsigned short ax, unsigned sho。
44、rt ip, unsign ed short cs,unsigned short flags)AX = ax;BX = bx ;CX = cx;DX = dx ;ES = es ;/ * Switch to our stack so we wont run on somebody elses * /_asm ;set up a local stackeli ; stop interruptsmov OldStackSeg,ss ; save stack segmentmov OldStackPtr,sp ; save stack pointer (offset)mov ax,ds ; repl。
45、ace with my stack smov ss,ax ; dittomov ax,MyStackOff ; replace with my stack sadd ax,STACKSIZE-2 ;add in my stack sizemov sp ,ax ; dittosti ; OK for interrupts againswitch (AX) case 0x10; / * print string found in ES:BX */ * Copy data from other application locally * /FP_ SEG (callerBufPtr) = ES ;FP_OFF (callerBufPtr) = BX ;_fstrcpy (localBufPtr。