目录
第十三章:<stdlib.h>
第十四章:<string.h>
第十二章:<stdio.h>
缓存区:
标准I/O提供缓存的目的是尽可能减少使用read和write调用的数量(系统调用比普通函数调用开销大)。它也对每个I/O流自动地进行缓存管理,避免了应用程序需要考虑这一点所带来的麻烦。
标准I/O提供了三种类型的缓存:
(1) 全缓存。在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。对于驻在磁盘上的文件通常是由标准I/O库实施全缓存的。
(2) 行缓存。在这种情况下,当在输入和输出中遇到新行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符(用标准I/O fputc函数),但只有在写了一行之后才进行实际I/O操作。
(3) 不带缓存。标准I/O库不对字符进行缓存。如果用标准I/O函数写若干字符到不带缓存的流中,则相当于用write系统调用函数将这些字符写至相关联的打开文件上。
标准出错流stderr通常是不带缓存的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个新行字符。
ANSI C要求下列缓存特征:
(1) 当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的。
(2) 标准出错决不会是全缓存的
可以通过下面的函数改变缓存类型
void setbuf(FILE *restrict fp, char *restrict buf);
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);
这些函数必须在流打开之后、但是未对流做任何操作之前被调用
参数buf通常指向一个长度为BUFSIZ的缓冲区,BUFSIZ在stdio.h中定义,可自行输出查看
#ifndef BUFSIZ
# define BUFSIZ _IO_BUFSIZ
如要关闭缓冲,将参数buf传入值为NULL
单字符输入\输出
int getc(FILE *fp),
int fgetc(FILE *fp)
int getchar(void)
int putc(int c, FILE *fp)
int fputc(int c, FILE *fp)
int putchar(int c)
字符串输入\输出:
char * gets(char* buf); //接受换行符之前所有字符(不论是开头的还是中间的空格,制表都包括在内)并自动添加'\0',它也会接受最后的那个换行符,但是会丢弃它。gets()可能写越界,常用更安全的fgets()。
char * fgets ( char * str, int num, FILE * stream ); //读取不超过num-1个字符,然后在末尾加上结束符 '\0' ,或者遇到换行符结束输入,同时换行符也被传入。
int puts(const char *char) //每次将换行符写到输出
int fputs(const char * str, FILE * fp); //将一个以NULL终止的字符串写到指定的流,终止符NULL不写出
格式化输入\输出:
int scanf(const char *format, ...) //从标准sdtin输入:
int sscanf(const char *buf, const char *format, ...) //从字符串buf输入;
int fscanf(FILE *fp, const char *format, ...) //从文件流fp输入:
int printf ( const char * format, ... ) //输出数据到标准stdout,要换行符才会立刻输出,否则在缓存区:
int sprintf (char *buf, size_t n, const char * format, ... ) //输出数据到字符串:
int fprintf (FILE *fp, const char * format, ... ) //输出数据到标准文件流:
文件操作
FILE *fopen(char *filename, char *mode); //打开文件:
int fclose(FILE *fp); //关闭文件:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); //写入数据:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) ; //读出数据:
int fflush(FILE *stream); //清空缓存区:
void rewind(FILE *stream); //文件指针回到开头,清除文件流:
int feof(FILE *stream); //判断文件指针是否到了结尾:
void clearerr(FILE *stream) ; //清除给定流 stream 的文件结束和错误标识符:
long ftell(FILE *stream); //返回文件的位置
int fseek(FILE *stream, long int offset, int whence) ; //设置文件指针的位置:
whence定义
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
文件打开方式
r代表read的简写,+代表可读可写,w代表write,b代表bit二进制位,t代表text
r 只读方式 打开文件,打开的文件必须存在
rt 只读打开 文本文件,该文本必须存在。
rb 只读打开 二进制文件,,该文本必须存在。
r+ 可读可写 打开文件,该文件必须存在,在文件开始位置写入,会覆盖后面的内容
rt+ 读写打开 文本文件,该文件必须存在,在文件开始位置写入,会覆盖后面的内容
rb+ 读写打开 二进制文件,该文件必须存在, 在文件开始位置写入,会覆盖后面的内容
w 只写方式 打开文件,若文件存在,则文件长度清零,若文件不存在则建立该文件。
wt 打开只写 文本文件,若文件存在,则文件长度清零,若文件不存在则建立该文件。
wb 打开只写 二进制文件,若文件存在,则文件长度清零,若文件不存在则建立该文件。
w+ 可读可写 打开文件,若文件存在,则文件长度清零,若文件不存在则建立该文件,
wt+ 打开可读写 文本文件,若文件存在,则文件长度清零,若文件不存在则建立该文件。
wb+ 打开可读写 二进制文件,若文件存在,则文件长度清零,若文件不存在则建立该文件。
a 以附加的方式打开只写文件,若文件不存在,则建立文件,存在则在文件尾部添加数据,即追加内容。
at文本文件的追加,不存在则创建,只能写。
ab二进制数据的追加,不存在则创建,只能写。
a+以附加的方式打开可读写文件,不存在则建立文件,存在则写入数据到文件尾(这里的读文件,同样需要使用rewind()函数,但是写文件不需要rewind()函数,a是追加)。
at+读写打开一个文本文件,允许读或在文本末追加数据(这里的读文件,同样需要使用rewind()函数,但是写文件不需要rewind()函数,a是追加)。
ab+读写打开一个二进制文件,不存在则创建,允许读或在文本末追加数据(这里的读文件,同样需要使用rewind()函数,但是写文件不需要rewind()函数,a是追加)。
第十三章:<stdlib.h>
主要有6大类:
整型数学:abs,div,labs,lidv
算法:bsearch,qsort,rand,srand
文本转换:atof,atoi,atol,strtod,strtol,strtoul
多字节转换:mblen,mbstowcs,mbtowc,wcstombs,wctomb
存储分配:calloc,free,malloc,realloc
环境接口:abort,atexit,exit,getenv,system
1 文本转换
double atof (const char* nptr); //除出错后的行为,它等价于: duoble strtod(nptr, (char **)NULL)
int atoi (const char*nptr);
long atol (const char*)nptr;
double strtod (const char*nptr, char**endptr);
long strtol (const char*nptr, char**endptr, int base);
unsigned long strtoul (const char*nptr, char**endptr, int base);
itoa() 将整型值转换为字符串,与ANSC不兼容,推荐使用sprintf()
itoa() 将长整型值转换为字符串,与ANSC不兼容,推荐使用sprintf()
ultoa() 将无符号长整型值转换为字符串,与ANSC不兼容,推荐使用sprintf()
2 算法
/*常量*/
#define RAND_MAX 0x7FFF //rand的最大返回值
/*函数*/
void srand (unsigned int); //置随机数发生器(种子)
int rand (void); //返回下一个伪随机数
void* bsearch (const void*, const void*, size_t, size_t, int (*)(const void*, const void*)); //二分查找
void qsort (const void*, size_t, size_t, int (*)(const void*, const void*)); //快速查找
3 存储分配
常量
#define NULL ((void *)0) 空指针
函数
void* calloc (size_t, size_t); 分配内存, 并清零
void* malloc (size_t); 分配内存
void* realloc (void*, size_t); 重新分配内存, 返回新指针
void free (void*); 释放内存
4 环境接口
常量
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
函数
void abort (void); //使程序异常终止,除非捕获了信号SIGABRT且信号处理程序没有返回
void exit (int); //是程序正常终止
int atexit (void (*func)(void)); //函数atexit注册的func指向的函数,该函数在程序正常终止的时候被调用,而不需要任何参数
int system (const char*name); //系统命令
char* getenv (const char*); //搜索环境表,查找一个能和nane指向串匹配的串,返回一个指向串的指针,这个串与匹配的列表成员相关
5 数学运算
结构
typedef struct { int quot, rem; } div_t;
typedef struct { long quot, rem; } ldiv_t;
函数
int abs (int); //绝对值
long labs (long);
div_t div (int, int); //除法,向下取整
ldiv_t ldiv (long, long);
6多字节转换
常量
MB_CUR_MAX 多字节字符中的最大字节数
函数
size_t wcstombs (char*, const wchar_t*, size_t); //宽字节转多字节,可转移多个
int wctomb (char*, wchar_t); //宽字节转多字节,一次转一个
int mblen (const char*, size_t); //确定一个宽字节字符的多字节序列长度
size_t mbstowcs (wchar_t*, const char*, size_t);
int mbtowc (wchar_t*, const char*, size_t);
第十四章:<string.h>
size_t strlen(const char *s) ; -----求字符串长度,若字符串没有\0,这个函数会越过字符串的末尾。
char *strcpy(char *s1, const char *s2); -----字符串拷贝
char *strncpy(char *s1, const char *s2, size_t n);
void *memcpy(void *dest, const void *src, size_t n); ————从src复制n个字符到dest。
void *memmove(void *s1, const void *s2, size_t n);
char *strcat(char *s1, const char *s2); -----字符串连接,两数组都要有'\0'作为字符串的结尾
char *strncat(char *s1, const char *s2, size_t n);
int strcmp(const char *s1, const char *s2); -----字符串比较
注:不能直接用关系运算符比较两个字符串的大小。如 if(stra==strb) //错误
C++的string类对==操作符功能重载,可以使用stra==strb
int strncmp(const char *s1, const char *s2, size_t n);
int memcmp(const void *str1, const void *str2, size_t n); ————比较str1和str2的前n个字节。
void *memchr(const void *str, int c, size_t n); ————搜索str前n个字节第一次出现的字符c(转换为unsigned char类型)的指向。
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c); -----c最后一次出现的位置
char *strstr(const char *s1, const char *s); ————子串s2在串s1中第一次出现的位置,没有找到返回NULL
char *strtok(char *s1, const char *s2); ————以串s2为字符界定,把串s1分解
void *memset(void *str, int c, size_t n) ————把字符c(转换为unsigned char类型)复制到符串参数str指向前n个字符。
第十五章:<time.h>
#define CLOCKS_PER_SEC _CPS ————函数clock的返回值的每秒的时间单位
typedef unsigned int clock_t;
typedef unsinged long time_t;
struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday; //day of month, [1-31]
int tm_mon;
int tm_year;
int tm_wday; //weekday, [0-6]
int tm_yday; //day of year, [0, 365]
int tm_isdst; //夏令时标志, [0, +]
};
cloct_t clock(void): ——获取程序开始执行后占用的处理器时间,返回值clock_t。
time_t time(time_t *timer): ——获取当前系统时间(UTC时间)的time_t值。
char *ctime(const time_t *timer): ————将time_t值转换为表示本地时间的字符串。
struct tm *gmttime(const time_t *timer): ————将time_t值转换为表示GMT时间的字符串。
struct tm *localtime(const time_t *timer):————将time_t转换为表示本地时间的strunct tm结构。
time_t mktime(struct tm *timeptr): ————将表示本地时间的struct tm转换为time_t。
char *asctime(const struct tm *timeptr): ————将struct tm转换为字符串形式("sun sep 16 01:03:53 1973\n\0")。
double difftime(time_t time1, time_t time2): ————得到两个日历时之间的差值。
size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timer): 自定义把结构体tm的日期与时间信息转换为制定的格式。