The Standard C Library 经典的基础
C的标志库函数是学习和使用C语言的基础,是编写经典C程序的基础,是学习其他计算机知识的基础.C标志库中一共包含了15个头文件:
<assert.h> <ctype.h> <stdio.h> <stdlib.h> <string.h> <limits.h> <float.h> <time.h>
<math.h> <setjmp.h> <signal.h> <stdarg.h> <stddef.h> <errno.h> <locale.h>
1:<assert.h>
NDEBUG
NDEBUG宏是调试开关,当使用#include NDEBUG时程序为非调试状态,这种状态下调试宏assert不起作用。
assert
调试宏assert只有在程序处于调试状态下才发挥作用,它的使用形式如下:assert(expression);当条件为假时会在屏幕中输出如下的调试信息:“Assertion failed:expression, file xyz, line nnn”,其中xyp是assert所在的文件名,nnn为assert在该文件中的位置。
assert宏还有许多用法,请参看《Writing Clean Code》第二章设计并使用断言。
2:<stdio.h>
<stdio.h>下面的类型,宏,函数都是分类的
其他:
size_t sizeof返回的值
NULL 空指针
文件:
FILE 文件的类型
fpos_t 文件中指针的位置
EOF 文件末尾<0
FILENAME_MAX 文件名最大值>0
FOPEN_MAX 同时打开文件的最大值>8
SEEK_SET 文件头
SEEK_CUR 文件当前位置
SEEK_END 文件末尾
打开文件
FILE *fopen(const char *filename,const char *mode);
更改当前流相关的文件
FILE *freopen(const char *filename,const char *mode,FILE *stream);
关闭文件
int fclose(FILE *stream);
清除流中的错误标志或文件末尾标志
void clearerr(FILE *stream);
测试流上的文件末尾标志
int feof(FILE *stream);
测试流上的错误标志
int ferror(FILE *stream);
将一个字符放回到流中
int ungetc(int c, FILE *stream);
从流中读一个字符
int fgetc(FILE *stream);
int getc(FILE *stream);
写一个字符到一个流
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
从流中获取一个字符串
char *fgets(char *s, int n, FILE *stream);
写一个字符串到一个流
int fputs(const char *s, FILE *stream);
打印一个格式化数据到一个流
int fprintf(FILE *stream,const char *format, ...);
使用一个参量列表指针格式化到流的数据
int vfprintf(FILE *stream,const char *format, va_list ap);
从一个流中读取格式化数据
int fscanf(FILE *stream, const char *format, ...);
从一个流中读数据
size_t fread(char *buffer,size_t size,size_t count,FILE *stream);
写数据到一个流
int fwrite(const char *buffer, size_t size, size_t count,
FILE *stream);
获取流的文件位置指示符
int fgetpos(FILE *stream, fpos_t *pos);
设置流位置指示符
int fsetpos(FILE *stream, const fpos_t *pos);
移动文件指针到一个指定的位置
int fseek(FILE *stream, long offset, int origin);
获得文件指针相对于文件头的偏移量
long ftell(FILE *stream);
重新定位一个文件指针到文件开头
void rewind(FILE *steam);
删除一个文件
int remove(const char *path);
更改一个文件或目录
int rename(const char *oldname, const char *newname);
缓冲区:
_IOFBF
_IOLBF
_IONBF 缓冲区类型
BUFSIZE 缓冲区尺寸>=256
刷新一个流并清空与流相关的缓冲区的内容
int fflush(FILE *stream);
控制流的缓冲区,已经被setvbuf代替
void setbuf(FILE *stream, char *buffer);
控制流的缓冲区类型和缓冲区大小
int setvbuf(FILE *stream, char *buffer, int mode, size_t size);
将一个格式化数据写入一个字符串
int sprintf(char *buffer, const char *format, ...);
从字符串中读格式化数据
int sscanf(const char *buffer, const char *format, ...);
从参量列表指针格式化到字符串
int vsprintf(char *buffer, const char *format, va_list ap);
临时文件
L_tmpnam 临时文件名长度>0
TMP_MAX 产生唯一文件名的最大数目>=25
以二进制读写的方式建立一个临时文件
FILE *tmpfile(void);
建立一个临时文件名
char *tmpname(char *string);
标准流:
stdin 标准输入流
stdout 标准输出流
stderr 标准错误输出流
从stdin获得一个字符
int getchar(void);
把字符写道stdout
int putchar(int c);
从stdin中获取一行
char *gets(char *buffer);
写一个字符串到stdout
int puts(const char *string);
打印一个错误消息到stderr
void perror(const char *error);
打印格式化数据到stdout
int printf(const char *format, ...);
从stdin读格式化数据
int scanf(const char *format, ...);
从参量列表指针格式化到stdout
int vprintf(const char *format, va_list ap);
3:<stdlib.h>
<stdlib.h>中定义的函数都是工具类的函数可以分类学习
其他:
NULL
size_t
执行一个系统命令
int system(const char *command);
程序控制:
EXIT_SUCCESS
EXIT_FAILURE exit函数的推出参数
终止当前进程并返回一个错误代码
void abort(void);
在推出时执行指定的函数
int atexit(void(*func)(void));
终止调用进程
void exit(int status);
数学工具:
div_t 函数div的返回类型
ldiv_t 函数ldiv的返回类型
RAND_MAX rand函数返回的最大值
产生一个伪随机数
int rand(void);
设置一个随机起始点
void srand(unsigned int seed);
计算绝对值
int abs(int i);
计算一个long整数的绝对值
long labs(long l);
执行一个快速排序
void qsort(void *base, size_t count, size_t size,
int (*compare)(const void *elem1, const void *elem2));
执行一个排序数组的二叉查找
void *bsearch(const void *key, const void *base,
size_t count, size_t size,
int(*compare)(const void *elem1,const void *elem2)
);
计算两个数的商与余数
div_t div(int number, int denom);
计算两个long整数的商和余数
ldiv_t ldiv(long number, long denom);
字符/字符串工具
wchar_t 宽字符宽度
MB_CUR_MAX 多字节字符中的最大字节数
将字符串转换成双精度
double atof(const char *string);
将字符串转换成整数
int atoi(const char *string);
将字符串转换成长整形
long atol(const char *string);
把字符串转换成一个双精度值
double strtod(const char *string, char **endptr);
把字符串转换成长整形
long strtol(const char *string, char **endptr, int base);
把字符串转换成无符号长整形
unsigned long strtoul(const char *string, char **endptr, int base);
获取长度和确定一个多字节字符的有效性
int mblen(const char *s, size_t count);
将一个多字节字符序列转换成宽字符序列
size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count));
将一个多字节字符转换成对应的宽字符
int mbtowc(wchar_t *wchar, const char *mbchar, size_t count));
将一个宽字符序列转换成一个多字节字符序列
size_t wcstombs(char *mbstr, wchar_t *wcstr, size_t count));
将一个宽字符转换成一个多字节字符
int wctomb(char *mbchar, wchar_t wchar);
内存管理工具:
分配内存块
void *malloc(size_t size);
在内存中分配一个数组并初始化为0
void *calloc(size_t count, size_t size);
重新分配内存块
void *recalloc(void *memblock, size_t size);
释放一块内存
void free(void *memblock);
环境工具:
从当前环境中取得一个值
char *getenv(const char *varname);
4 <ctype.h>
<ctype.h>头文件中定义了有关于字符操作的函数
判断一个字符是否为控制字符(0x00 ~ 0x1f 或 0x7f)
int iscntrl(int c);
判断一个字符是否为空白字符(0x09 ~ 0x0d 或 0x20)
int isspace(int c);
判断一个字符是否为可打印字符(0x20 ~ 0x7e)
int isprint(int c);
判断一个字符是否为非空格的其他可打印字符(0x21 ~ 0x7e)
int isgraph(int c);
判断一个字符是否为标点字符
int ispunct(int c);
判断一个字符是否为字母数字字符
int isalnum(int c);
判断一个字符是否为十进制数字字符
int isdigit(int c);
判断一个字符是否为十六进制数字字符
int isxdigit(int c);
判断一个字符是否为字母字符
int isalpha(int c);
判断一个字符是否为大写字母字符
int isupper(int c);
判断一个字符是否为小写字母字符
int islower(int c);
转换字符为小写
int tolower(int c);
转换字符为大写
int toupper(int c);
5<string.h>:
<string.h>中声明的函数都是关于c字符串和内存操作的函数
其他:
NULL
size_t
内存操作:
查找内存块中的一个字符
void *memchr(const void *buffer, int c, size_t count);
比较两个内存块中的字符
int memcmp(const void *buffer1,const void *buffer2,size_t count);
在在内存块之间拷贝字节
void *memcpy(void *dest, const void *src, size_t count);
移动内存块
void *memmove(void *dest, const void *src, size_t count);
用指定的字符填充内存
void *memset(void *dest, int c, size_t count);
对于以上的函数中的size_t count项使用需注意了
当你按如下方式使用是错误的
str = (char *)malloc(sizeof(char)*81);
strp = (char *)memchr(str, ‘u’, sizeof(str));
free(str);
这是错误的str是指针它的长度不是整个字符串的长度,所以strp得不到正确的结果
应改为一个确定的数或者是实际数组的长度如strlen(str).
字符串操作:
字符串拼接
char *strcat(char *dest, const char *src);
向一个字符串末尾添加指定长度的字符串
char *strncat(char *dest, const char *src, size_t n);
在字符串中查找一个字符
char *strchr(const char *str, int c);
在一个字符串中查找一个字符最后一次出现
char *strrchr(const char *str, int c);
比较字符串
int strcmp(const char *str1, const char *str2);
比较两个字符串中指定长度的子串的大小
int strncmp(const char *str1, const char *str2, size_t n);
使用指定场所的信息比较字符串
int strcoll(const char *str1, const char *str2);
基于指定场所转换一个字符串
size_t strxfrm(char *dest, const char *src, size_t n);
拷贝一个字符串
char *strcpy(char *dest, const char *src);
将源字符串中指定长度的子串拷贝到目的串中
char *strncpy(char *dest, const char *src, size_t n);
查找一个子串
char *strstr(const char *string, const char *str);
查找string包含str中包含的字符的长度,例如:
string = “cabbage”; str = “abc”; return value = 5;
string = “cab bage”; str = “abc”; return value = 3;
string = “cafbbage”; str = “abc”; return value = 2;
string = “vcabbage”; str = “abc”; return value = 0;
size_t strspn(const char *string, const char *str);
在一个字符串中查找另一字符串的任意字符第一次出现的下标例如
string = “cabbage”; str = “ag”; return value = 1;
string = “xcabbage”; str = “ag”; return value = 2;
size_t strcspn(const char *string, const char *str);
返回在string中出现str字符集中的第一个字符的位置例如:
string = “kdkow adkf akkei”;str = “aeiw”;
return value = “w adkf akkei”;
char *strpbrk(const char *string, const char *str);
查找字符串中下一个语言符号
所谓的语言符号就是指用户定义的表示一个意义的整体,string是字符串,str是包含分割语言符合的分隔符的集合.使用方法例如:
token = strtok(string,str);
while(token != NULL)
{
puts(token);
token = strtok(NULL, str);
}
如
string = “kks\niiwo jfie\twlk,diwpob.owf’ksif\nli”;
str = “ \n\t,.’”;
结果为:
kks
iiwo
jfie
wlk
diwpob
owf
ksif
li
如
str = “w”;
结果为:
kks\nii
o jfie\t
lk,di
pob.o
f’ksif\nli
char *strtok(char *string, const char *str);
通过系统错误编号来获得系统错误消息
char *strerror(int errorcode);
获取字符串有效长度(不包括’\0’)
size_t strlen(const char *str);
6<limits.h>:
<limits.h> 中定义了整形的各种形式的边界值
char
CHAR_BIT 一个char占的位数
MB_LEN_MAX 多字节中char占的字节数
CHAR_MAX
CHAR_MIN
SCHAR_MAX
SCHAR_MIN
UCHAR_MAX
short
SHRT_MAX
SHRT_MIN
USHRT_MAX
int