课程编号: C语言常用库函数 版本: 讲师: 联系方式:
目的与目标 学习使用C语言常用库函数
课程概述 math.h stdio.h stdlib.h malloc.h string.h assert.h
动态存储分配(malloc.h) 函数名: malloc 功 能: 内存分配函数 用 法: void *malloc(unsigned size); 程序例: #include <stdlib.h> /* For _MAX_PATH definition */ #include <stdio.h> #include <malloc.h> void main( void ) { char *string; /* Allocate space for a path name */ string = malloc( _MAX_PATH ); if( string == NULL ) printf( "Insufficient memory available\n" ); else{ printf( "Memory space allocated for path name\n" ); free( string ); printf( "Memory freed\n" ); }
动态存储分配(malloc.h) 函数名: free 功 能: 释放已分配的块 用 法: void free(void *ptr); 程序例: #include <string.h> #include <stdio.h> #include <malloc.h> int main(void) { char *str; /* allocate memory for string */ str = malloc(10); /* copy "Hello" to string */ strcpy(str, "Hello"); /* display string */ printf("String is %s\n", str); /* free memory */ free(str); return 0; }
动态存储分配(malloc.h) { long *buffer; size_t size; 函数名: realloc 功 能:改变已分配内存的大小,ptr为已分配有内存区域的指针,newsize为新的长度,返回分配好的内存指针; 用 法: void *realloc(void *ptr,unsigned newsize) 程序例: #include <stdio.h> #include <malloc.h> #include <stdlib.h> void main( void ) { long *buffer; size_t size; if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL ) exit( 1 ); size = _msize( buffer ); printf( "Size of block after malloc of 1000 longs: %u\n", size ); /* Reallocate and show new size: */ if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) )) == NULL ) printf( "Size of block after realloc of 1000 more longs: %u\n", size ); free( buffer ); exit( 0 ); }
动态存储分配(malloc.h) 函数名:calloc 功 能:分配nelem个长度为elsize的内存空间并返回所分配内存的指针 ; 用 法: void *calloc( size_t num, size_t size ); 程序例: #include <stdio.h> #include <malloc.h> void main( void ) { long *buffer; buffer = (long *)calloc( 40, sizeof( long ) ); if( buffer != NULL ) printf( "Allocated 40 long integers\n" ); else printf( "Can't allocate memory\n" ); free( buffer ); }
类型转换函数(stdlib.h) 函数名: atof 功 能: 把字符串转换成双精度数,并返回这个数,错误返回0; 用 法: double atof(const char *nptr); 程序例: #include <stdlib.h> #include <stdio.h> int main(void) { float f; char *str = "12345.67"; f = atof(str); printf("string = %s float = %f\n", str, f); return 0; }
类型转换函数(stdlib.h) 函数名: atoi 功 能: 把字符串转换成整型数,并返回这个数,错误返回0; 用 法: int atoi(const char *nptr); 程序例: #include <stdlib.h> #include <stdio.h> int main(void) { int n; char *str = "12345.67"; n = atoi(str); printf("string = %s integer = %d\n", str, n); return 0; }
类型转换函数(stdlib.h) 函数名: atol 功 能: 把字符串转换成长整型数,并返回这个数,错误返回0; 用 法: long atol(const char *nptr); 程序例: #include <stdlib.h> #include <stdio.h> int main(void) { long l; char *str = "98765432"; l = atol(lstr); printf("string = %s integer = %ld\n", str, l); return(0); }
随机数函数(stdlib.h) 函数名: srand 功 能: 初始化随机数发生器 用 法: void srand(unsigned seed); 程序例: #include <stdlib.h> #include <stdio.h> #include <time.h> int main(void) { int i; time_t t; srand((unsigned) time(&t)); printf("Ten random numbers from 0 to 99\n\n"); for(i=0; i<10; i++) printf("%d\n", rand() % 100); return 0; }
随机数函数(stdlib.h) 函数名: rand 功 能: 随机数发生器 用 法: void rand(void);
输入输出函数(stdio.h) 函数名: fopen 功 能:打开用filename指定的文件,并使其与一个流相联。 用 法: FILE *fopen(const char *filename,const char *mode) 使用方式:文件指针名=fopen("文件名","处理方式") "处理方式"取: "rt" 打开一个文本文件,只能读。 "wt" 生成一个文本文件,只能写。若文件存在则被重写。 "at" 打开一个文本文件,只能在文件尾部添加。 "rb" 打开一个二进制文件,只能读。 "wb" 生成一个二进制文件,只能写。 "ab" 打开一个二进制文件,只能在文件尾部添加。 "rt+" 打开一个文本文件,可读可写。 "wt+" 生成一个文本文件,可读可写。 "at+" 打开一个文本文件,可读可添加。 "rb+" 打开一个二进制文件,可读可写。 "wb+" 生成一个二进制文件,可读可写。 "ab+" 打开一个二进制文件,可读可添加。 返回值:指明流的指针(成功时)或NULL(失败时) 注:需先定义 FILE *文件指针名; "文件名"若用 argv[1]代替,则可使用命令行形式指定文件名
输入输出函数(stdio.h) 函数名: fclose 功 能: 关闭一个流 用 法: int fclose(FILE *stream); 程序例: #include <string.h> #include <stdio.h> int main(void) { FILE *fp; char buf[11] = "0123456789"; /* create a file containing 10 bytes */ fp = fopen("DUMMY.FIL", "w"); fwrite(&buf, strlen(buf), 1, fp); /* close the file */ fclose(fp); return 0; }
输入输出函数(stdio.h) 函数名: fread 功 能: 从一个流中读数据 用 法: int fread(void *ptr, int size, int nitems, FILE *stream); 程序例: #include <string.h> #include <stdio.h> int main(void) { FILE *stream; char msg[] = "this is a test"; char buf[20]; if ((stream = fopen("DUMMY.FIL", "w+"))== NULL) { fprintf(stderr,"Cannot open output file.\n"); return 1; } /* write some data to the file */ fwrite(msg, strlen(msg)+1, 1, stream); /* seek to the beginning of the file */ fseek(stream, SEEK_SET, 0); /* read the data and display it */ fread(buf, strlen(msg)+1, 1, stream); printf("%s\n", buf); fclose(stream); return 0; }
输入输出函数(stdio.h) 函数名: fseek 功 能: 重定位流上的文件指针 用 法: int fseek(FILE *stream,long offset,int fromwhere); 程序例: #include <stdio.h> long filesize(FILE *stream); int main(void) { FILE *stream; stream = fopen("MYFILE.TXT", "w+"); fprintf(stream, "This is a test"); printf("Filesize of MYFILE.TXT is %ld bytes\n", filesize(stream)); fclose(stream); return 0; }
输入输出函数(stdio.h) 函数名: fwrite 功 能: 写内容到流中 用 法: int fwrite(void *ptr, int size, int nitems, FILE *stream);
输入输出函数(stdio.h) 函数名: sprintf 功 能: 送格式化输出到字符串中 用 法: int sprintf(char *string, char *farmat [,argument,...]); 程序例: #include <stdio.h> #include <math.h> int main(void) { char buffer[80]; sprintf(buffer, "An approximation of Pi is %f\n", M_PI); puts(buffer); return 0; }
存储数组操作函数(memory.h) 函数名: memcpy 功 能: 从源source中拷贝n个字节到目标destin中 用 法: void *memcpy(void *destin, void *source, unsigned n); 程序例: #include <stdio.h> #include <string.h> #include <memory.h> int main(void) { char src[] = "******************************"; char dest[] = "abcdefghijlkmnopqrstuvwxyz0123456709"; char *ptr; printf("destination before memcpy: %s\n", dest); ptr = memcpy(dest, src, strlen(src)); if (ptr) printf("destination after memcpy: %s\n", dest); else printf("memcpy failed\n"); return 0; }
存储数组操作函数(memory.h) 函数名: memset 功 能: 设置s中的所有字节为ch, s数组的大小由n给定 用 法: void *memset(void *s, char ch, unsigned n); 程序例: #include <string.h> #include <stdio.h> #include <memory.h> int main(void) { char buffer[] = "Hello world\n"; printf("Buffer before memset: %s\n", buffer); memset(buffer, '*', strlen(buffer) - 1); printf("Buffer after memset: %s\n", buffer); return 0; }
存储数组操作函数(memory.h) 函数名: memcmp 功 能:比较正好是n字节长的两个字符串s1和s2; 用 法: int memcmp( const void *buf1, const void *buf2, size_t count ); 程序例: #include <string.h> #include <stdio.h> void main( void ) { char first[] = "12345678901234567890"; char second[] = "12345678901234567891"; int result; result = memcmp( first, second, 19 ); if( result < 0 ) printf( "First is less than second.\n" ); else if( result == 0 ) printf( "First is equal to second.\n" ); else if( result > 0 ) printf( "First is greater than second.\n" ); result = memcmp( first, second, 20 ); }
字符串函数(string.h) 函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *strcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) { char string[10]; char *str1 = "abcdefghi"; strcpy(string, str1); printf("%s\n", string); return 0; }
字符串函数(string.h) 函数名: strcat 功 能: 字符串拼接函数 用 法: char *strcat(char *destin, char *source); 程序例: #include <string.h> #include <stdio.h> int main(void) { char destination[25]; char *blank = " ", *c = "C++", *Borland = "Borland"; strcpy(destination, Borland); strcat(destination, blank); strcat(destination, c); printf("%s\n", destination); return 0; }
字符串函数(string.h) 函数名: strcmp 功 能: 串比较 用 法: int strcmp(char *str1, char *str2); 程序例: #include <string.h> #include <stdio.h> int main(void) { char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc"; int ptr; ptr = strcmp(buf2, buf1); if (ptr > 0) printf("buffer 2 is greater than buffer 1\n"); else printf("buffer 2 is less than buffer 1\n"); ptr = strcmp(buf2, buf3); if (ptr > 0) printf("buffer 2 is greater than buffer 3\n"); else printf("buffer 2 is less than buffer 3\n"); return 0; }
字符串函数(string.h) 函数名: strcpy 功 能: 串拷贝 用 法: char *strcpy(char *str1, char *str2); 程序例: #include <stdio.h> #include <string.h> int main(void) { char string[10]; char *str1 = "abcdefghi"; strcpy(string, str1); printf("%s\n", string); return 0; }
数学函数(math.h) 函数名:abs 功能:求整数的绝对值 用法:int abs(int i) 程序例: #include <stdio.h> #include <math.h> int main(void) { int number = -1234; printf("number: %d absolute value: %d\n",number, abs(number)); return 0; }
数学函数(math.h) 函数名: acos 功 能: 反余弦函数 用 法: double acos(double x); 程序例: #include <stdio.h> #include <math.h> int main(void) { double result; double x = 0.5; result = acos(x); printf("The arc cosine of %lf is %lf\n", x, result); return 0; }
数学函数(math.h) 函数名: asin 功 能: 反正弦函数 用 法: double asin(double x); 程序例: #include <stdio.h> #include <math.h> int main(void) { double result; double x = 0.5; result = asin(x); printf("The arc sin of %lf is %lf\n", x, result); return(0); }
数学函数(math.h) 函数名: atan 功 能: 反正切函数 用 法: double atan(double x); 程序例: #include <stdio.h> #include <math.h> int main(void) { double result; double x = 0.5; result = atan(x); printf("The arc tangent of %lf is %lf\n",x,result); return(0); }
数学函数(math.h) 函数名: atan2 功 能: 计算Y/X的反正切值 用 法: double atan2(double y, double x); 程序例: #include <stdio.h> #include <math.h> int main(void) { double result; double x = 90.0, y = 45.0; result = atan2(y,x); printf("The arc tangent ratio of %lf is %lf\n",(y/ x),result); return 0; }
数学函数(math.h) 函数名: fmod 功 能: 计算x对y的模, 即x/y的余数 用 法: double fmod(double x, double y); 程序例: #include <stdio.h> #include <math.h> int main(void) { double x = 5.0, y = 2.0; double result; result = fmod(x,y); printf("The remainder of (%lf / %lf) is %lf\n", x, y, result); return 0; }
数学函数(math.h) 函数名: sqrt 功 能: 计算平方根 用 法: double sqrt(double x); 程序例: #include <math.h> #include <stdio.h> int main(void) { double x = 4.0, result; result = sqrt(x); printf("The square root of %lf is %lf\n",x,result); return 0; }
诊断函数(assert.h) 函数名: assert 功 能: 测试一个条件并可能使程序终止 用 法: void assert(int test); 程序例: #include <assert.h> #include <stdio.h> #include <stdlib.h> struct ITEM { int key; int value; }; void additem(struct ITEM *itemptr) { assert(itemptr != NULL); } int main(void) { additem(NULL); return 0; }
总结
问题讨论
参考资料