320 likes | 436 Views
第 1 章 C++ 程序设计基础. 网络游戏开发 -C++ 程序设计. 第 3 章函数. 标准库函数的使用 函数重载 内联函数. 标准库函数 函数重载. 函数重载. 了解标准库函数 掌握函数重载. 第 3 章函数. 3.4 标准库函数的使用. C++ 语言提供了极为丰富的库函数。. 第 3 章函数. 3.4 标准库函数的使用. C 语言标准库中的各个函数,类型以及宏分别在以下标准头文件中说明: assert.h float.h math.h stdarg.h stdlib.h
E N D
第1章 C++程序设计基础 网络游戏开发-C++程序设计
第3章函数 标准库函数的使用 函数重载 内联函数 标准库函数 函数重载 函数重载 了解标准库函数 掌握函数重载
第3章函数 3.4 标准库函数的使用 C++语言提供了极为丰富的库函数。
第3章函数 3.4 标准库函数的使用 C语言标准库中的各个函数,类型以及宏分别在以下标准头文件中说明: assert.h float.h math.h stdarg.h stdlib.h ctype.h limits.h setjmp.h stddef.h string.h errno.h locale.h signal.h stdio.h time.h 头文件声明格式为: #include <头文件名>
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 1. 文件操作 <stdio.h> 打开一个流可以将该流与一个文件或设备关联起来,这一关联可以通过关闭流而终止。 打开一个文件将返回一个指向FILE类型对象的指针,包含控制该流的所有必要的信息。 C++应用程序 FILE 文件/设备
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 1. 文件操作 FILE * fopen(const char * filename, const char* mode);
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 1. 文件操作 • 关闭文件 int fclose(FILE * stream); • 删除文件 int remove(const char* filename); • 重命名文件 int rename(const char * oldname, const char *newname);
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 2. 格式化输入函数 • fscanf函数 int fscanf(FILE * stream, const char * format, ...); int scanf(const char* format, ...); format 61 20 66 6f 78 20 66 61 6c 6c 20… %s a fox fall into water %f 3.25 00 00 50 40 %d 76 0x0000004c
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 3. 字符输入输出函数 • fgetc函数 int fgetc(FILE * stream); 以unsigned char类型返回stream流中的一个字符。 • fgets函数 char * fgets(char *s, int n, FILE *stream); fgets函数用于读入最多n-1个字符到数组s中。
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 3. 字符输入输出函数 • fputs函数 int fputs(const char *s, FILE *stream); 以unsigned char类型返回stream流中的一个字符。 • 其他输入输出函数 int getc(FILE *stream); int getchar(void); char *gets(char *s); int putc(int c, FILE * stream); int putchar(int c); int puts(const char *s); int ungetc(int c , FILE * stream);
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 4. 直接输入输出函数 • fread函数 size_t fread(void *ptr, size_t size size_t nobj, FILE *stream); 读入最多nobj个长度为size的对象到ptr指向的数组中。 • fwrite函数 size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *stream); 把ptr所指向的数组中nobj个长度为size的对象输出到流stream中。
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 5. 文件定位函数 • fseek函数 int fseek(FILE *stream, long offset, int origin); fseek函数用于文件定位,读写操作将从新位置开始。 offset是偏移量 origin是平移参考位置: • SEEK_SET(文件开始处) • SEEK_CUR(当前位置) • SEEK_END(文件结束处) 61 20 66 6f 78 20 66 61 6c 6c 20… 读/写指针 fread/fwrite
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 5. 文件定位函数 • ftell函数 返回与stream流相关的文件的当前位置。 long ftell(FILE *stream); • rewind函数 等价于fseek(fp, 0L, SEEK_SET)与clearerr(fp)这两个函数顺序执行的效果。 void rewind(FILE *stream);
第3章函数 3.4 标准库函数的使用 3.4.1 输入和输出 6. 错误处理函数 当发生错误或到达文件末尾时,标准库中的许多函数将设置状态指示符。这些状态指示符可被显式地设置和测试。 void clearerr(FILE *stream); int feof(FILE *stream); int ferror(FILE *stream); void perror(const char *s);
第3章函数 3.4 标准库函数的使用 3.4.2 字符类测试 isalnum(c); //函数isalpha(c)或isdigit(c)为真。 isalpha(c); //函数isupper(c)或islower(c)为真。 iscntrl(c); //c为控制字符。 isdigit(c); //c十进制数字。 isgraph(c); //c是除空格外的可打印字符。 islower(c); //c是小写字母。 isprint(c); //c是包括空格的可打印字符。 ispunct(c); //c是除空格,字母和数字外的可打印字符。
第3章函数 3.4 标准库函数的使用 3.4.2 字符类测试 isspace(c); // c是空格,换页符,换行符,回车符,横向制表符和纵向制表符。 isupper(c); //c是大写字母。 isxdigit(c); //c是十六进制数字。 在7位ASCII字符集中, • 可打印字符: 0x20(‘ ’)~0x7E('`') • 控制字符: 0(NUL)~0x1F(US) 和字符0x7F(DEL) int tolower(int c); //把c转换为小写字母 int toupper(int c); //把c转换为大写字母
第3章函数 3.4 标准库函数的使用 3.4.3 字符串函数 1. str函数 在头文件<string.h>中定义了两组字符串函数: • 以str开头的函数 • 以mem开头的函数 • 拷贝 char *strcpy(char *strDestination, const char *strSource ); char *strncpy(char *strDest,const char *strSource,size_t count); • 追加 char *strcat(char *strDestination, const char *strSource); char *strncat(char *strDest, const char *strSource, size_t count); • 追加 int strcmp(const char *string1,const char *string2); int strncmp(const char *string1,const char *string2,size_t count );
第3章函数 3.4 标准库函数的使用 3.4.3 字符串函数 1. str函数 //返回一个指向字符串string中字符c最后一次出现的位置的指针,如果没有就返回NULL char *strchr(const char *string,int c); //返回字符串string中由字符串strCharSet中的字符构成的第一个子串的长度。 size_t strspn(const char *string, const char *strCharSet); //返回字符串string中由不在字符串strCharSet中的字符组成的第一个字串的长度。 size_t strcspn(const char *string,const char *strCharSet); //返回指向字符串strCharSet中的任意字符第一次出现在字符串string中的位置的指针 char *strpbrk(const char *string,const char *strCharSet); //字符串查找 char *strstr(const char *string,const char *strSearch ); size_t strlen(const char *string ); //求字符串长度 char *strerror(int errnum); //找出strDelimit分割的下一个单词 char *strtok( char *strToken, const char *strDelimit );
第3章函数 3.4 标准库函数的使用 3.4.3 字符串函数 1. 2. mem函数 void *memcpy(void* dest,const void* src,size_t count ); void *memmove(void* dest, const void* src, size_t count ); int memcmp(const void* buf1, const void* buf2, size_t count ); void *memset(void* dest, int c, size_t count );
第3章函数 3.4 标准库函数的使用 3.4.4 数学函数
第3章函数 3.4 标准库函数的使用 3.4.5 实用函数 • 数值转换 double atof(const char *s); int atoi(const char *s); long atol(const char *s); double strtod(const char *s, char **endp); long strtol(const char *s, char **endp, int base) unsigned long strtoul strtoul(const char* s, char **endp, int base); • 随机数函数 int rand(void); void srand(unsigned int seed); • 内存分配函数 void *calloc(size_t nobj, size_t size); void *malloc(size_t size); void *realloc(void *p, size_t size); void free(void *p);
第3章函数 3.4 标准库函数的使用 3.4.5 实用函数 • 其他函数 void abort(void); void exit(int status); int atexit(void (*fcn)(void)); int system(const char *s); char *getenv(const char *name) void bsearch (const void *key, const void *base, size_t n,size_t size, int (*cmp)(const void *keyval, const void *datum) ); void qsort(void *base,size_t n, size_t size,int (*cmp)(const void *, const void *)); int abs(int n) long labs(long n) div_t div(int num, int denom) ldiv_t ldiv(long num, long denom) 3.4.6 断言函数 void assert(int表达式);
第3章函数 3.4 标准库函数的使用 3.4.7 变长参数表 type va_arg(va_list ap,类型); void va_end(va_list ap); 3.4.8 日期与时间函数 time_t time(time *tp) char *asctime(const struct tm *tp); char *ctime(const time_t *tp); struct tm *gmtime(const time_t *tp); struct tm *localtime(const time_t *tp);
第3章函数 3.4 标准库函数的使用 3.4.7 变长参数表 头文件<limits.h>中定义了用于表示整数类型大小的常量
第3章函数 3.5 函数重载 功能相似 重载(overload)函数 void Eat(Beef …); void Eat(Fish …); void Eat(Chicken …); void EatBeef(…); void EatFish(…); void EatChicken(…); void Print(…); // 全局函数 class A {… void Print(…); // 成员函数 } 不是重载
第3章函数 3.5 函数重载 隐式类型转换导致重载函数产生二义性。 void output(int x); // 函数声明 void output(float x); // 函数声明 // output(0.5); // 错误!不明确的调用 output(int(0.5)); // 输出整型0 output(float(0.5)); // 输出浮点型0.5
第3章函数 3.6 内联函数 3.6.1 内联函数 用inline关键字修饰的函数是内联函数。 • 关键字inline必须与函数定义体放在一起才能使函数成为内联, • 将inline放在函数声明前面不起任何作用。 void Foo(int x, int y); inline void Foo(int x, int y) { … } • 如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。 • 如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
第3章函数 3.6 内联函数 3.6.2 内联函数与带参的宏 内联函数的优势: • 类型安全检查 • 自动类型转换 • 可以作为类的成员
第3章函数 小结 本节课讲解函数的应用 • 标准库函数的使用 • 函数重载 • 内联函数
第3章函数 自测题 1.strcmp函数遇到不相同的两个字符后就停止比较。( ) 2.atof函数能将字符串转换为float型变量。( )
第3章函数 自测题 1.strcmp函数遇到不相同的两个字符后就停止比较。(对) 题目分析:函数只需要返回第一个不符合的字符就返回 2.atof函数能将字符串转换为float型变量。(错) 题目分析:返回类型为double型
第3章函数 课后作业 【作业1】利用标准库函数显示当前时间格式如下: 2007/11/20 15:34 【作业2】读取一个文本文件,用字符串函数查找任意单词在文件中出现的次数。