对于很多刚刚接触C语言和TC环境的同学,学习面向过程和结构化的思想以及C语言的语法是学习中的重中之重,但是在对此二者有了一个比较牢固的基础之后若想继续提高,一是要学习一些常用的能够解决实际问题的处理方法和计算机在存储数据方面的知识,我们称之为算法和数据结构,这能使你可以解决问题的数量大幅度增加;二是要学习所使用的语言和环境给我们提供的可以直接利用的资源,也就是库。
随着计算机技术的迅猛发展,我们要处理和解决的问题规模越来越大,结构也越来越复杂,这决定了我们在编程的时候不可能每个细节都从零写起,而要运用许多现成的可以保证正确的代码来实现比较固定的功能,这种固定的功能实现常常以库函数的形式体现出来。C语言的库中提供了许多实现某一特定目的的函数,这能使你编程的效率大大提高,并且使程序的逻辑更加清晰。
预备知识
有些同学在学习库函数的时候感觉特别痛苦,其中部分原因是由于对语言的基本概念掌握不牢所造成的。对于C语言,要想熟练地使用库函数,必须对函数的调用机制,形参实参的传递过程和返回值的处理有一个全面而准确的认识,弄清传值调用和传地址调用的区别的联系,充分掌握这些知识才能很快理解别人写出的函数在接口和实现的功能上存在着怎样的联系。另外,如果你不只满足于使用库中的函数而有志于通过剖解它们的代码来获取别人的编程经验,那么你还需要拥有较强的阅读程序的能力。 最常用库函数介绍
即使对于初学者,也有一些函数是在练习编程的过程中无可避免地将使用到的,对于这种使用频繁的函数我们有必要尽快掌握,实际上这些函数通常集中声明在以下几个头文件中:<stdio.h>、<math.h>和<stdlib.h>。
<stdio.h>中声明了C语言中大部分关于输入输出操作的函数,我们只需要调用这些函数便能对输入与输出做出处理,而不需要考虑到硬件的问题。大家从接触C语言开始,哪怕是最简单的“Hello,world”程序也要在程序开始写下一行#include <stdio.h>,可见这个头文件中所声明函数的使用频率之高。
这个头文件中所声明关于标准输入输出的常用函数列表如下:
函数名 函数原型 具体功能
scanf int scanf(const char*format[,argument]...); 从标准输入装置读入数据,并可根据argument做的设定,把数据依照要求的格式写到要求的位置
printf int printf(const char*format [,argument]...); 将所有数据格式化并一起输出到标准输出装置
gets char *gets(char *buffer); 从标准输入数据流里取得一整行的数据,并存入buffer中。它会直接取得所有输入的字符,直到欲换行为止
puts int puts(const char *string); 把指定字符串输出给标准输出装置
getchar int getchar(void); 由标准输入装置读取一个字符
putc int putc(int c); 将单个字符输出到标准输出装置
除了关于标准输入输出的函数之外,<stdio.h>中还声明了大量与文件读写操作有关的函数,这些函数中的一部分和标准输入输出的功能类似,只不过将数据流改变到了文件上;另一部分是为文件打开、关闭以及文件指针定向等提供的基本操作,同学们可以在学习了和文件操作相关的内容之后再来复习它们。此外,<stdio.h>中的sscanf和sprintf两个函数可以利用字符串进行读写操作,在一些特定的场合可以为数据转换提供很大的方便。
<math.h>中声明的库函数用来处理相关的数学问题,这些数学函数大部分都是作用于浮点数类型的数据,其所支持的功能包括三角函数数值运算、指数对数运算、绝对值以及一些基本的数值处理,现在将这些函数用下表加以总结:
功能范围 函数名 函数原型 具体功能
三角函数与
反三角函数 sin double sin(double x); 计算x弧度的正弦值
cos double cos(double x); 计算x弧度的余弦值
tan double tan(double x); 计算x弧度的正切值
asin double asin(double x); 计算绝对值不大于1的浮点数的反正弦值
acos double acos(double x); 计算绝对值不大于1的浮点数的反余弦值
atan double atan(double x); 计算浮点数的反正切值
指数对数运算 log double log(double x); 计算正浮点数的自然对数值
log10 double log10(double x); 计算正浮点数的以10为底的对数值
pow double pow(double x,double y); 计算x的y次方
exp double exp(double x); 计算e的x次方
sqrt double sqrt(double x); 计算非负浮点数的平方根
绝对值计算 fabs double fabs(double x); 计算浮点数的绝对值
数值处理 ceil double ceil(double x); 求出大于一个浮点数的最小整数
floor double floor(double x); 求出小于一个浮点数的最大整数
modf double modf(double x,int *intptr); 求浮点数的小数部分,整数部分写入第二个参数指向的地址
fmod double fmod(double x,double y); 求两浮点数相除后的余数
熟悉数学库中的函数是学习编程过程中必不可少的一环,因为这些函数如同输入输出函数一样有着较高的使用频率,并且其中的一部分很难自己写出源码实现。
< stdlib.h>中声明了许多相当基本的函数,让C语言的使用者仅仅使用标准函数库就能实现强大的功能,其中涉及到数据类型转换、内存操作、随机数处理、排序和程序流程控制等方方面面的内容,在下表中笔者着重介绍数据类型转换和随机数处理这两个初学者比较常用方面的常用函数,关于内存操作的函数读者可以在
http://www.frontfree.net/articles/services/view.asp?id=504&page=1
中找到比较详细的说明。
功能范围 函数名 函数原型 具体功能
数据类型转换 atof double atof(const char *string); 将字符串转换为浮点类型
atoi int atoi(const char *string); 将字符串转换为整数类型
atol long atol(const char *string); 将字符串转换为长整数类型
itoa char* itoa(int value,char *string,int radix); 将整数类型的数值转换为字符串,radix描述了进制的选择,范围在2到36之间
fcvt char *fcvt(double value,int count,int *dec,int *sign); 将浮点数转换为字符串,value为要被转换的数值,count为小数点后的位数,dec为小数点所在的位置,sign描述正负号
随机数 srand void srand(unsigned int seed); 设定随机种子
rand int rand(void); 随机产生一数值
另外几个比较常用的头文件所声明的函数功能
除了<stdio.h>、<math.h>和<stdlib.h>之外,还有一些头文件中声明了比较常用的函数,下表总结了一些头文件所声明函数的功能范围。
头文件 头文件中所声明函数的功能描述
<assert.h> 在程序执行过程中设定插入点,便于程序员进行究错工作
<time.h> 处理时间,便于程序员使用到系统的时间
<string.h> 对字符串的各种处理
<ctype.h> 对字符的相关处理
<graphics.h> 与在图形界面作图有关的处理
结语
本文介绍的只是C语言和TC环境函数库中所提供的库函数的最常用的很小的最一部分,许多库函数涉及到的理论和应用需要读者对语言本身的原理和机制了解加深后才可以得到较为透彻的体会。另外笔者建议大家在学习相关内容的同时可以参考库函数的实现,因为这些代码大都简洁精炼,可以作为很好的教材。比如吃透 <string.h>中所声明的各个函数的原码,那么你对字符串处理的能力和感觉以及对指针的认识都会有一个较大的提高。总之,库函数除了提高你的编程效率,让你放心地使用一些品质优良的零件之外,还能帮你巩固所学的知识,提高阅读代码的能力,告诉你钢铁是怎样炼成的。