c语言函数库
第七章(其它函数)
1. abort:异常终止进程函数 1
2. atexit:注册终止函数 2
3. bsearch:二分搜索函数 2
4. calloc:分配主存储器函数 4
5. exit:正常终止进程函数 5
6. free:释放内存函数 6
7. getenv:获取环境变量 6
8. malloc:动态分配内存函数 7
9. qsort:快速排序函数 7
10. realloc:重新分配主存函数 9
1. abort:异常终止进程函数
函数原型:void abort(void)
头文件:#include<stdlib.h>
是否是标准函数:是
函数功能:异常终止一个进程,并打印一条终止信息“Abnormal program termination”到stderr。
返回值:无返回值。
例程如下: 利用abort函数终止一个程序
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Calling abort()\n");
abort();
printf("Is the program be held?\n");
return 0;
}
例程说明:
本例程调用abort函数实现了一个程序的终止。实际上,该程序执行到abort语句处就被异常终止了,并没有执行后面两条语句。
本例程的运行结果为:
Calling abort()
Abnormal program termination
注意:
由于abort函数是异常终止一个进程,因此系统会将一条终止信息“Abnormal program termination”输出到stderr。
2. atexit:注册终止函数
函数原型:int atexit(void * func)
头文件:#include<stdlib.h>
是否是标准函数:是
函数功能:注册终止函数。其中参数func为指向函数的指针。在程序正常终止时,系统会调用注册了的func函数。
返回值:注册成功返回0,否则返回非0。
例程如下: 利用函数atexit注册出口函数。
#include <stdio.h>
#include <stdlib.h>
void fun1(void)
{
printf("Exit function #1 called\n");
}
void fun2(void)
{
printf("Exit function #2 called\n");
}
int main(void)
{
atexit(fun1);
atexit(fun2);
return 0;
}
例程说明:
(1)首先,程序依次注册(登记)了两个出口函数fun1和fun2。
(2)当程序正常终止时,系统依次调用注册了的出口函数fun1和fun2。
本例程的运行结果为:
Exit function #2 called
Exit function #1 called
注意:
1、最多可以用atexit函数注册(登记)32个出口函数。
2、调用出口函数时,按照先注册后调用,后注册先调用的原则。因此本例程中先调用出口函数fun2,后调用出口函数fun1。
3. bsearch:二分搜索函数
函数原型:void *bsearch(const void *key, const void *base, size_t *nelem, size_t width, int(*fcmp)(const void *, const *))
头文件:#include<stdlib.h>
是否是标准函数:是
函数功能:二分法查。参数key指向要查的关键字的指针,base指向从小到大的次序存放元素的查表,nelem指定查表元素的个数,width指定查表中每个元素的字节数,int(*fcmp)(const void *, const *)为由用户提供的比较函数。
返回值:如果没有到匹配的值返回0,否则返回匹配项的指针。
例程如下: 用二分法在有序数列中查元素。
#include <stdio.h>
#include <stdlib.h>
int CMP(int *a,int *b)
{
if(*a<*b)
return -1;
else if(*a>*b)
return 1;
else
return 0;
}
int main(void)
{
int search[10]={1,3,6,7,10,11,13,19,28,56} ;
int a=13,*p,i;
/*对数组search进行二分搜索13*/
p=(int *)bsearch(&a, search,10, sizeof(int),CMP);
printf("The elems of the array are\n");
for(i=0;i<10;i++)
printf("%d ",search[i]);
/*显示元素13在原数组中的位置*/
if(p)
printf("\nThe elem 13 is located at %d of the array\n",p-search+1);
else
printf(“\nSearch is fail!!\n”);
getchar();
}
例程说明:
(1)首先,初始化一个查数组search,在这里,该数组一定是按照键值从小到大排列的。
(2)利用函数bsearch进行二分法搜索。参数&a为要查的关键字的指针,要查的关键字a为13;参数search为查表首地址;10为查表元素个数;sizeof(int)为查表中每个元素的字节数,大小为2个字节;CMP为比较函数的指针。
(3)将查后的结果(匹配项的指针)赋值给指针变量p。
(4)显示元素13在原数组中的位置(由指针p和数组首地址search确定)。
本例程的运行结果为:
The elems of the array are
1 3 6 7 10 11 13 19 28 56
The elem 13 is located at 7 of the array
注意:
1、关于用户提供的比较函数:
bsearch函数需要用户提供一个比较搜索函数,该函数由bsearch函数调用,并向该比较搜索函数传递两个指针参数a和b。用户定义的比较函数必须在a<b时返回-1,在a=b时返回0,在a>b时返回1。这里的大于、小于、等于,完全由用户来定义。本例程中定义的大于、小于、等于就是数学上的大于、小于、等于。
2、二分法搜索简介:
二分法搜索又叫做折半搜索或折半查。它是一种经典的顺序文件查算法,要求查表按关键字有序排列(从小到大或从大到小,bsearch函数要求从小到大排列)。其查思想是:逐渐缩小查范围,直至得到查结果。查过程为(以从小到大的序列为例):将要查的元素的关键字k与当前当前查范围内位于居中的那个元素的关键字进行比较,若匹配,则查成功,返回该元素的指针即可;否则,若查元素的关键字k小于当前查范围内位于居中的那个元素的关键字,则到当前查范围的前半部分重复上述查过程,若查元素的关键字k大于当前查范围内位于居中的那个元素的关键字,则到当前查范围的后半部分重复上述查过程。
二分法搜索的查效率较顺序搜索的查效率要高许多,因此在进行顺序文件的搜索查中是很实用的。有关二分法搜索算法的详细讲述请参看数据结构、算法分析等书目。
4. calloc:分配主存储器函数
函数原型:void *calloc(size_t nelem, size_t size)
头文件:#include<stdlib.h>
是否是标准函数:是
函数功能:分配并刷新内存。函数calloc有两个参数,第一个参数nelem指出要分配内存空间的项数;第二个参数size表明每一项的字节数。
返回值:分配成功返回第一个分配字节的指针,否则返回NULL。
例程如下: 利用函数calloc动态分配内存空间
#include<stdlib.h>
main()
{
int i,j,*p=NULL;
printf("Please enter the size for allocation\n");
scanf("%d",&i);
p=(int *)calloc(i,sizeof(int));
if(p)
{
printf("Please enter %d datas\n",i);
for(j=0;j<i;j++)
scanf("%d",&p[j]);
}
else {
printf("Allocation is fail\n");
return 0;
}
printf("The datas are\n");
for(j=0;j<i;j++)
printf("%d ",p[j]);
}
例程说明:
(1)本例程首先通过终端输入要开辟内存空间的大小,将其保留在变量i中。
(2)通过函数calloc动态分配内存空间(由用户指定i),并将分配空间的首地址赋值给指针变量p。
(3)如果分配成功(即p不为NULL),向该内存空间写入数据。
字符串函数库(4)打印出刚才写入的数据。
本例程的运行结果为:
Please enter the size for alloc
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论