C笔记
C语言
基本语法
逗号表达式以右侧为值,有趣的用法for(…逗号…分号…分号…逗号…)
%求模时,第一个数为正数模为正数,负数为负数
为防止=和混淆,可以k=5,5k利于区分
变量可以用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第1个字符必须是字符或下划线,不能是数字
&&一般前项为零后不再计算
~按位反 &按位与 |按位或 ^按位异或
<<左移>>右移,只移位不改变本身值
\可以使一个逻辑行变成两个物理行
选择/循环
if( ) { }
else if ( ) { }
while( ) { }
do{ } while();
for(i=0;i<1;i++) { }
指针
NULL,表示空指针,就是给0赋指针类型,可以直接当0用
没有指向的指针称为野指针
申请空内存也会返回随机0字节指针
数组
Int a[10]={1,[4]=3,5,6}初始化指定项
二维数组初始化 int a[2][2]={{2,2},{2,2}}或{0,0,0,0}
如果是以指针形式定义的数组,num[0]==*(num+0)
下标越界;匿名数组
联合体
结构体
#pragma pack(数字) 改变对齐数,默认是8
结构体名用arr.next指向内容,结构体指针用->指向内容
结构体变量指针不能同一行简易命名
递归
结构体内含结构体指针,应当二次内存申请
有头链表可以将数据个数存在链头里
typedef struct Node
{
int data;
struct Node* next;
}NODE,*LPNODE//一个是结构体类型,一个是结构体指针类型
struct Node first= {1, ptr};
NODE second = {2,ptr};
LPNODE ptr = NULL;
宏
宏替换(只是单纯替换) #define a 1
define MAX(a,b) ((a)>(b)?(a):(b)) 一定要加括号
多语句宏(容易和原函数产生冲突)
#define print(data) if(data % 2 = 0) \
printf("偶数\n"); \
else printf("奇数\n"); \
//可以把函数部分用do{}while(0);包含,使变量变成局部变量
123,直接将数字转换为字符串
name##123, 连接字符串
预编译
预编译在程序运行之前,
#if ...
...
#endif
//
#if ...
....
#elif ...
...
#else
...
#endif
//
#ifdef M
#define M 2
#endif
#undef M 取消宏的作用域
program message("123") 在控制台打印
pragma warning(disable: 4996) 禁止错误
program 后期补充
命令行参数
int main(int argc ,char *argv[])第一个数值读取命令行有多少个字符串,第二个获取字符串(包括程序名),使用c>program(程序名) abc abc abc(windows) $ program – abc abc abc(UNIX)
使用arvg[数字]就可以调用字符串
一些杂识(VS)
(int*)和*(int**)的区别
#ifndef _cpluscplus //编译主体不是C++
extern "C"
{
#include "cplus.h" //把所有代码按照C语言的变方式
}
#endif
头文件目录设置
可以设置包含路径
#include <stdio.h> //标准库文件
#include "D:\\a\\test.h"//绝对路径
#include "./test.h"//相对路径,下一个目录
#include "../abc/test.h"//上一个路径
程序生成
编辑-->test.c 源文件
编译-->test.obj目标文件
连接-->test.exe二进制文件
运行-->软件
数据类型
整形常量
正常的整形常量:1,2,3
无符号整形常量(unsigned):1u
长整型常量(long double):1l
超长整形常量(long long ):12ll
浮点数(float):f
短整型无特殊表示方式
实数常量
单精度:1.1f
双精度:1.2(一般小数默认双精度)
特殊表示方式:科学计数法 2.33E10
字符常量
字符边界符 :‘ ’
正常字符:‘A'
特殊字符:转义字符和特殊字符

ASCII表

制表符
/t不满8位按8位对齐,超出16,24依次,
要和16位对齐用/t/t
格式控制符
%d:用来输出有符号的十进制整数(包括char类型)
%u:用来输出无符号的十进制整数(包括char类型)
%o:用来输出无符号的八进制整数
%x:用来输出无符号的十六进制整数
%c:用来输出单个字符
%s:用来输出一个字符串
%f:用来输出小数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
%e:用来输出指数形式的十进制浮点数(输入时小数形式和指数形式都可以识别)
%g:用来输出指数形式和小数形式两者中较短的十进制浮点数(输入时小数形式和指数形式都可以识别)
%-2.3 -表示左对齐,2表示2位整数位,3表示2位小数位
%08,用0填补多余位
字符串常量
字符串边界符:“ ”
正常字符串“ABC"
”A“其实有两个字符’A'和‘/0’
基本数据类型
int:整数
float:单精度
double:双精度,小数默认double
float:浮点

数据储存
原码:引入符号位,1为负,0为正
反码:原码符号位不变其余取反
补码:反码加一
正数三码合一
大段0x78 56 34 12
小段0x12 34 56 78
只有数字有大小段,字符串没有
修饰符
long/short 长短,只修饰整数
signed/unsigned 有无符号,不修饰float,double
const 只读,必须初始化
static 静态标识符,将变量或函数限制在当前域内,且不会随调用结束而释放内存
extern 外部声明,可使用头文件中包含的变量,函数基本默认外部声明,常引用static类型
auto 自动变量,有和没有一样
register 寄存器标识,不常用,不能取地址,内存有限制
volatile 易变量声明,防止放入寄存器
restrict 指针专用,表明指针所指变量无其他方式改动,用于优化
进制转换
二进制转十进制:加权
十进制转二进制:除二倒取余
其他
写代码先画图,后写注释,再打代码
定值写等式判断符左边,变量写右边
傻逼vs设置无效手动兼容
vs两次ctrl显示注释
多个项目调试要在项目管理器里设置启动项
工具,错误查找可以查找一定错误
1B=8b
内存在调试中打开
sizeof在编译器中运行
alt+enter 自动在新文件中生成函数主体
ctrl+alt+home 跳到函数本体位置
alt拖拽,垂直输入
防止头文件重复定义:
#ifndef _Mneu_H_s
#define _Mneu_H_
.....
#endif
防止getchar被printf影响,有时fflush()不靠谱
#define CLEAR_BUF \
{\
int ch; \
while ((ch = getchar()) != EOF && ch != '\n')\
{\
; \
}\
}
浮点
浮点数计算(-1)S*M*2E
101.0即为(-1)0*1.01*22
S=0,M=1,E=2(存储事默认M自带第一个一)
单精度浮点数(32)位S 1bit,E 8bit,M 23bit
(64)位S 1bit,E 11bit,M 53bit
E为无符号数,存入E时应加中间数,32位加127,64位加1023
假如E为10,E=10+127=137,若E=-10,E=-10+127=117
若E在内存中为0,直接取符号位和M(不加1)乘以2^-126,或为0
若E全为1,M为0,无穷大
常用函数
参考网址:https://cplusplus.com/reference/clibrary/
`#include <assert.h> //断言
include <ctype.h> //字符操作
include <stdio.h> //输入输出头文件
include <stdlib.h>
include <errno.h> //错误宏
include <fenv.h> //浮点数类型
include <inttypes.h> //整数类型的
include <iso646.h> //运算符用符号表达
include <limits.h> //数据范围
include <locale.h> //特定日期或者货币符号
include <math.h> //数学函数
include <setjmp.h> //跨函数跳转
include <signal.h> //信号处理
include <stdarg.h> //可变函数实现
include <stdbool.h> //C语言的bool类型 true和false
include <stddef.h> //标准库隐式类型和宏
include <stdint.h> //各种标准的int
include <stdlib.h> //内存:malloc.h 随机数: rand,srand 类型转换 atoi
include <string.h> //字符串处理
include <tgmath.h> //数学函数的泛型宏 支持复数运算符 1+2i
include <time.h> //时间函数
include <uchar.h> //无符号char类型描述
include <wchar.h> //宽字节版本
include <wctype.h> //宽字节字符的处理`
studio.h
文件管理函数
FILE类型
typedef struct
{
short level; //缓冲区使用量
unsigned flags; //文件状态标志
char fd; //文件内容描述符
unsigned char hold; //其他信息
short bsize; //缓冲区大小
unsigned char *buffer; //缓冲区首地址
unsigned ar*curp; //指向文件缓冲区的工作指针
unsigned istemp;
short token;
};FILE
fopen()函数
FILE *fopen(const char *filename,const char *mode)
打开文件并返回与之相关的流,打开失败返回NULL
加上后缀b表示以二进制打开
freopen()
FILE *freopen(const char *filename,const char *mode,FILE *stream)
以mode模式打开文件,并关联到stream指定的流,返回steam,出错返回NULL。一般用于改变与stdin,stdout和stderr相关联的文件。
fflush()
int fflush(FILE *stream)(淘汰了?)
将缓冲区内未写入的数据写到文件中。返回0,错误返回EOF。fflush(NULL)清洗所有输出流
flose()
int fclose(FILE *stream)
将所有未写入的数据写入stream中,丢弃缓冲区未读入数据,释放自动分配的缓冲区,最后关闭流。返回0,出错返回EOF。
remove()
int rename(const char *oldname,const char *newname)
rename函数修改文件的名字。如果操作失败,则返回一个非0值。
tmpfile()
FILE *tmpfile(void)
tmpfile函数以模式"wb+"创建一个临时文件,该文件在被关闭或程序正常结束时将被 自动删除。如果创建操作成功,该函数返回一个流;如果创建文件失败,则返回 NULL。
tmpnam()
char *tmpnam(char s[L_tmpnam])
tmpnam(NULL)函数创建一个与现有文件名不同的字符串,并返回一个指向一内部静态数组的指针。tmpnam(S)函数把创建的字符串保存到数组 s 中,并将它作为函数值返回。s 中至少要有 L_tmpnam 个字符的空间。Tmpnam 函数在每次被调用时均生成不同的名字。在程序执行的过程中,最多只能确保生成 TMP_MAX 个不同的名字。注意,tmpnam 函数只是用 于创建一个名字,而不是创建一个文件。
setvbuf()
int setvbuf(FILE *stream,char *buf,int mode,size_t size)
setvbuf 函数控制流 stream 的缓冲。在执行读、写以及其它任何操作之前必须调用 函数。当 mode 的值为_IOFBF 时,将进行完全缓冲。当 mode 的值为_IOLBF 时,将对文本文件进行行缓冲,当mode 的值为_IONBF 时,表示不设置缓冲。如果 buf 的值不是 NULL,则 setvbuf 函数将 buf 指向的区域作为流的缓冲区,否则将分配一个缓冲区。size 决定缓 冲区的长度。如果 setvbuf 函数出错,则返回个一非 0值。
setbuf()
void setbuf(FILE *stream,char *buf)
如果 buf 的值为 NULL,则关闭流 stream 的缓冲;否则 setbuf 函数等价于 (void)setvbuf(stream, buf, _IOFBF, BUFSIZ)。
fread()
size_t fread(void *ptr,size_t size,size_t nobj,FILE *stream)
fread函数从流 stream 中读取最多 nobj 个长度为 size 的对象,并保存到 ptr 指向的数组中。它返回读取的对象数目,此返回值可能小于 nobj。必须通过函数 feof 和 ferror获得结果执行状态。
fwrite()
size_t fwrite(const void *ptr,size_t size,size_t nobj,FILE *stream)
fwrite函数从ptr指向的数组中读取nobj个长度为size的对象,并输出到流stream中。它返回输出的对象数目。如果发生错误,返回值会小于 nobj 的值。
文件定位
seek()函数
int fseek(FILE *stream,long offset,int origin)
fseek函数设置流 stream 的文件位置,后续的读写操作将从新位置开始。对于二进制文件,此位置被设置为从origin开始的第offset个字符处。Origin的值可以为SEEK_SET(文件开始处)、SEEK_CUR(当前位置)或 SEEK_END(文件结束处) 。对于文本流,offset必须设置为 0,或者是由函数 ftell 返回的值(此时 origin 的值必须是 SEEK_SET)。 fseek函数在出错时返回一个非 0 值,不一定是-1
ftell()函数
long ftell(File *stream)
ftell函数返回stream流的当前文件位置,出错时该函数返回-1L一般情况下,这个-1L与-1没有区别
rewind()函数
void rewind(FILE *stream)
rewind(fp)函数等价于语句fseek(fp, 0L, SEEK_SET);clearerr(fp)的执行结果。(clearerr函数见下文)
fgetpos()函数
int fgetpos(FILE *stream,fpos_t *ptr)
fgetpos 函数把 stream 流的当前位置记录在*ptr 中,供随后的 fsetpos 函数调用使用。若出错则返回一个非 0 值。
fsetpos()函数
int fsetpos(FILE *stream,const fpos_t *ptr)
fsetpos 函数将流 stream 的当前位置设置为 fgetpos 记录在*ptr 中的位置。若出错则返回一个非 0 值。
错误处理函数
clearerr()函数
void clearerr(FILE *stream)
clearerr 函数清除与流 stream 相关的文件结束符和错误指示符。
feof()函数
int feof(FILE *stream)
如果设置了与 stream 流相关的文件结束指示符,feof 函数将返回一个非 0 值。
ferror()函数
int ferror(FILE *stream)
如果设置了与 stream 流相关的错误指示符,ferror 函数将返回一个非 0 值。
perror()函数
void perror(cinst char *s)
perror(s)函数打印字符串 s 以及与 errno 中整型值相应的错误信息,错误信息的具体内容与具体的实现有关。该函数的功能类似于执行下列语句:fprintf(stderr, "%s: %s\n", s, "error message");
格式化输出/输出
fprintf()
int fprintf(FILE *stream,const char *format,...)
fprintf 函数按照 format 说明的格式对输出进行转换,并写到 stream 流中。返回值是实际写入的字符数。若出错则返回一个负值。
printf()
int printf(const char *format,...)
printf(…)函数等价于fprintf(stdout,…)
sprintf()
int sprintf(char *s,const char *format,...)
sprintf() 函数与 printf() 函数基本相同,但其输出将被写入到字符串 s 中,并以’\0’ 结束。s 必须足够大,以足够容纳下输出结果。该函数返回实际输出的字符数,不包括’\0’。
fscanf()函数
int fscanf(FILE *stream, const char *format, ...)
fscanf 函数根据格式串 format 从流 stream 中读取输入,并把转换后的值赋值给后续各个参数,其中的每个参数都必须是一个指针。当格式串 format 用完时,函数返回。同scanf()
scanf()函数
int scanf(const char *format, ...)
scanf(…)函数与 fscanf(stdin, …)等价。
支持转义字符,但支持长度控制不支持精度控制。
如果到达文件的末尾或在转换输入前出错,该函数返回 EOF;否则,返回实际被转换并赋值的输入项的数目。
使用*忽略字符,scanf(”%d,%*d,%d”,&d)
一般参数要用&,字符串不用
一般读入用空白即可隔断,%c只能用换行
scanf读取数据类型不符即停止读取
scanf(%d,%d)必须在整数后加“,”,scanf(%d ,%d)则中间可以多个空格或者无空格
sscanf()函数
int sscanf(const char *s,const char *format, ...)
sscanf(s, …)函数与 scanf(…)等价,所不同的是,前者的输入字符来源于字符串 s。其余同scanf()
字符输入/输出
fgetc()函数
int fgetc(FILE *stream)
fqetc 函数返回 stream 流的下一个字符,返回类型为 unsigned char(被转换为 int 类型)。如果到达文件末尾或发生错误,则返回 EOF。
fgets()函数
char *fgets(char *s,int n,FILE *stream)
fgets 函数最多将下 n-1 个字符读入到数组 s 中。当遇到换行符时,把换行符读入到数组 s 中,读取过程终止。数组 s 以’\0’结尾。fgets 函数返回数组 s。如果到达文件的末尾或发生错误,则返回 NULL。
fputc()函数
int fputc(int c,FILE *stream)
fputc 函数把字符 c(转换为 unsigned char 类型)输出到流 stream 中。它返回写入的字符,若出错则返回 EOF。
fputs()函数
int fputs(const char *s,FILE *stream)
fputs 函数把字符串 s(不包含字符’\n’)输出到流 Btream 中;它返回一个非负值 若出错则返回 EOF。
getc()函数
int getc(FILE *stream)
getc 函数等价于 fgetc,所不同的是,当 getc 函数定义为宏时,它可能多次计算stream 的值。所以,在宏中尽量不要使用getc
getchar()函数
int getchar(void)
getchar函数等价于getc(stdin).
gets()函数
char *gets(char *s)
gets 函数把下一个输入行读入到数组 s 中,并把末尾的换行符替换为字符’\0’。它返回数组 s,如果到达文件的末尾或发生错误,则返回 NULL/EOF。
putc()函数
int putc(int c,FILE *stream)
putc 函数等价于 fputc,所不同的是,当 putc 函数定义为宏时,它可能多次计算stream 的值。所以,在宏中尽量不要使用putc
putchar()函数
int putchar(int c)
putchar©函数等价于putc(c,stdout)
puts()函数
int puts(const char *s)
puts 函数把字符串 s 和一个换行符输出到 stdout 中。如果发生错误,则返回 EOF;否则返回一个非负值。
ungetc()函数
int ungetc(int c,FILE *stream)
ungetc 函数把 c(转换为 unsigned char 类型)写回到流 stream 中,下次对该流进行读操作时,将返回该字符。对每个流只能写回一个字符,且此字符不能是 EOF。ungetc函数返回被写回的字符,如果发生错误,则返回 EOF
feof()
int feof(FILE *stream);
判断文件指针是否到末尾,到末尾返回非0,没到返回0
type.h

tolower()
int tolower(int c)
将c转换为小写字母*
toupper()
int toupper(int c)
将c转换为大写字母*
string.h
sercpy()
char *strcpy(s,ct)
将字符串 ct(包括’\0’)复制到字符串 s 中,并返回 s
strncpy()
char *strncpy(s,ct,n)
将字符串 ct 中最多 n 个字符复制到字符串 s 中,并返回 s。如果 ct 中少于 n 个字符,则用’\0’填充
strcat()
char *strcat(s,ct)
将字符串 ct 连接到 s 的尾部,并返回 s,将后一个字符串接到前一个上去,不检查容量会溢出
strncat()
char *strncat(s,ct,n)
将字符串 ct 中最多前 n 个字符连接到字符串 s 的尾部,并以’\0’结束;该函数返回 s
strcmp()
int strcmp(cs,ct)
比较字符串 cs 和 ct;当 cs<ct 时,返回一个负数;当 cs==ct 时,返回 0;当 cs>ct 时,返回一个正数
strncmp()
int strncmp(cs,ct,n)
将字符串 cs 中至多前 n个字符与字符串 ct 相比较。当 cs<ct 时,返回一个负数:当 cs==ct 时,返回0;当 cs>ct 时,返回一个正数
strchr()
char *strchr(cs,c)
返回指向字符 c 在字符串 cs 中第一次出现的位置的指针;如果 cs 中不包含 c,则该函数返回 NULL
strrchr()
char *strrchr(cs,c)
返回指向字符 c 在字符串 cs 中最后一次出现的位置的指针;如果 cs 中不包含 c,则该函数返回 NULL
strspn()
size_t strspn(cs,ct)
返回字符串 cs 中包含 ct 中的字符的前缀的长度
strcspn()
size_t strcspn(cs,ct)
返回字符串 cs 中不包含 ct 中的字符的前缀的长度
strpbrk()
char *strpbrk(cs,ct)
返回一个指针,它指向字符串 ct 中的任意字符第一次出现在字符串 cs 中的位置;如果 cs 中没有与 ct 相同的字符,则返回 NULL
strstr()
char *strstr(cs,ct)
返回一个指针,它指向字符串 ct 第一次出现在字符串 cs 中的位置;如果 cs 中不包含字符串 ct,则返回 NULL
strlen()
size_t strlen(cs)
返回字符串 cs 的长度,计算字符串一定要+1,因为不计算/0
strerror()
char *strerror(n)
退回一个指针,它指向与错误编号 n 对应的错误信息字符串(错误信息的具体内容与具体实现相关)
strtok()
char *strtok(s,ct)
strtok函数在s中搜索由ct中的字符界定的记号。对 strtok(s, ct)进行一系列调用,可以把字符串 s 分成许多记号,这些记号以 ct 中的字符为分界符。对于s会改变原s
内存(字符)函数
memcpy()
void *memcpy(s,ct,n)
将字符串 ct 中的 n 个字符拷贝到 s 中,并返回 s
memmove()
void *memmove(s,ct,n)
该函数的功能与 memcpy 相似,所不同的是,当对象重叠时,该函数仍能正确执行
memcmp()
int memcmp(cs,ct,n)
将 cs 的前 n 个字符与 ct 进行比较,其返回值与 strcmp的返回值相同
memchr()
void *memchr(cs,c,n)
返回一个指针,它指向 c 在 cs 中第一次出现的位置。如果 cs 的前 n 个字符中找不到匹配,则返回 NULL
memset()
``void *memset(s,c,n)`
将 s 中的前 n 个字符替换为 c,并返回 s
math.h
宏 EDOM 和 ERANGE(在头文件<error.h>中声明)是两个非 0 整型常量,用于指示函数的定义域错误和值域错误;HUGE_VAL 是一个 double 类型的正数。当参数位于函数定义的作用域之外时,就会出现定义域错误。在发生定义域错误时,全局变量 errno 的值将被设置为 EDOM,函数的返回值与具体的实现相关。如果函数的结果不能用 double 类型表示,则会发生值域错误。当结果上溢时,函数返回 HUGE_VAL,并带有正确的正负号,errpo 的值将被设置为 ERANGE。当结果下溢时,函数返回 0,而 errno 是否设置为 ERANGE 要视具体的实现而定。
在下表中,x和y的类型为double,n的类型为int,所有函数的返回值的类型均为double。三角函数的角度用弧度表示
time.h
time_t :这个是用来存储unix时间戳的类型,大部分系统是定义为long型。
struct tm:一个用来保存时间和日期的结构类型。有几个数据要加一,重要
struct tm {
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月,范围从 0 到 11(注意) */
int tm_year; /* 自 1900 年起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};
struct timeval:一个保存秒和微妙信息的结构。
struct timeval {
long tv_sec; //秒
long tv_usec; //微秒
};
struct timezone:一个保存时区信息的结构
struct timezone {
int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/
int tz_dsttime; /* 夏令时*/
};
time()
time_t time(time_t \*t);
获取从 1970-01-01 00:00:00 +0000 (UTC) 到现在经过了多少秒
有参数从参数返回,无参数从返回值返回,失败返回(size_t )-1
gmtime
struct tm *gmtime(const time_t *timep);
通过time_t返回当前UTC时间
localtime()
struct tm *localtime(const time_t * timep);
返回当前时区时间
timegm()
time_t timegm(struct tm *tm);
返回代表UTC时间的time_t
timelocal()
time_t timelocal(struct tm *tm);
返回代表当地时间的time_t
mktime()
time_t mktime(strcut tm * timeptr);
将参数timeptr 所指的tm 结构数据转换成从公元1970 年1 月1 日0 时0 分0 秒算起至今的UTC 时间所经过的秒数
asctime()
char *asctime(const struct tm * timeptr);
将tm类型转换为字符串“Tue Jun 1 18:10:22 2021”
ctime()
char *ctime(const time_t *timep);
将time_t类型转换为字符串“Tue Jun 1 18:10:22 2021”
gettimeofday
int gettimeofday (struct timeval * tv, struct timezone * tz);
把目前的时间由tv 返回,当地时区的信息由tz 返回,成功则返回0,失败返回-1
settimeofday()
int settimeofday(const struct timeval *tv, const struct timezone *tz);
把目前时间设成由tv 所指的结构信息,当地时区信息则设成tz 所指的结构,成功返回0,失败返回-1
difftime()
double difftime(time_t time1, time_t time2);
返回两个时间相差秒数
stdlib.h
atof()
double atof(const char *s)
atof 函数将字符串 s 转换为 double 类型。该函数等价于 strtod ( s, (char**)NULL)。
atoi()
int atoi(const char *s)
atoi 函数将字符串 s 转换为 int 类型。该函数等价于(int)strtol(s, (char**)NULL, 10)。
atol()
long atol(const char *s)
atol 函数将字符串 s 转换为 long 类型。该函数等价于 strtol(s, (char**)NULL, 10)。
strtod()
double strtod(const char *s, char **endp)
strtod 函数将字符串 s 的前缀转换为 double 类型,并在转换时跳过 s 的前导空白符。除了endp为NULL,否则该函数将把指向s中未转换部分(s的后缀部分)的指针保存在*endp中。如果结果上溢,则函数返回带有适当符号 HUGE_VAL;如果结果下溢,则返回 0。在这两种情况下,errno 都将被设置为 ERANGE。
strtol()
long strtol(const char *s, char **endp, int base)
strtol 函数将字符串 s 的前缀转换为 long 类型,并在转换时跳过 s 的前导空白符。除非 endp 为 NULL,否则该函数将把指向 s 中末转换部分(s 的后辍部分)的指针保存在*endp 中。如果 base 的取值在 2~36 之间,则假定输入是以该数为基底的;如果 base 的取值为 0,则基底为八进制、十进制或十六进制。以 0 为前缀的是八进制,以 0x 或 0X 为前缀的是十六进制。无论在哪种情况下,字母均表示 10~base-1 之间的数字。如果 base 值是 16,则可以加上前导 0x 或 0X。如果结果上溢,则函数根据结果的符号返回 LONG_MAX 或 LONG_MIN,同时将 errno 的值设置为 ERANGE。
strtoul()
unsigned long strtoul(const char *s, char **endp, int base)
strtoul函数的功能与strtol函数相同,但其结果为unsigned long类型,错误值为ULONG_MAX。
rand()
int rand(void)
rand函数产生一个0~RAND_MAX之间的伪随机整数。RAND_MAX的取值至少为32767。
srand()
void srand(unsigned int seed)
srand函数将seed作为生成新的伪随机数序列的种子数。种子数seed的初值为1。随机数最小值为seed,一般可用时间作随机数srand((unsigned int)time(NULL));
calloc()
void *calloc(size_t nobj, size_t size)
calloc函数为由 nobj 个长度为 size 的对象组成的数组分配内存,并返回指向分配区域的指针;若无法满足要求,则返回 NULL。该空间的初始长度为 0 字节。
malloc()
void *malloc(size_t size)
malloc 函数为长度为 size 的对象分配内存,并返回指向分配区域的指针;若无法满足要求,则返回 NULL。该函数不对分配的内存区域进行初始化。
realloc()
void *realloc(void *p, size_t size)
realloc 函数将 p 指向的对象的长度修改为 size 个字节。如果新分配的内存比原内存大,则原内存的内容保持不变,增加的空间不进行初始化。如果新分配的内存比原内存小,则新分配内存单元不被初始化:realloc 函数返回指向新分配空间的指针;若无法满足要求,则返回 NULL。在这种情况下,原指针 p 指向的单元内容保持不变。
free()
void free(void *p)
free 函数释放 p 指向的内存空间。当 p 的值为 NULL 时,该函数不执行任何操作。P 必须指向先前使用动态分配函数 malloe、realloc 或 calloc 分配的空间。
abort()
void abort(void)
abort函数使程序非正常终止。其功能与raise(SIGABRT)类似。
exit()
void exit(int status)
exit 函数使程序正常终止。atexit 函数的调用顺序与注册的顺序相反,这种情况下,所有已打开的文件缓冲区将被清洗,所有已打开的流将被关闭,控制也将返回给环境。status的值如何返回给环境要视具体的实现而定,但 0 值表示终止成功。也可使用值 EXIT_SUCCESS 和 EXIT_FAILURE 作为返回值。
atexit()
int atexit(void (*fcn)(void))
atexit 函数注册函数 fcn,该函数将在程序正常终止时被调用。如果注册失败,则返回非 0 值。
system()
int system(const char *s)
system 函数将字符串 s 传递给执行环境。如果 s 的值为 NULL,并且有命令处理程序,则该函数返回非 0 值。如果 s 的值不是 NULL,则返回值与具体的实现有关。
getenv()
char *getenv(const char *name)
getenv 函数返回与 name 有关的环境字符串,如路径,系统名。如果该字符串不存在,则返回 NULL。
bsearch()
void *bsearch(const void *key,const void *base,size_t n,size_t size,int (*cmp)(const void *keyval,const void *datnum))
bsearch 函数在对升序结构进行二分查找,找不到返回NULL,找到返回指针
qsort()
void qsort(void *base,size_t n,size_t size,int (*cmp)(const void *,const void *))
qsort 函数对 base[0]…base[n-1]数组中的对象进行升序排序,数组中每个对象的长度为 size。比较函数 cmp 与 bsearch 函数中的描述相同。
abs()
int abs(int n)
abs函数返回int类型参数n的绝对值。
labs()
long labs(long n)
labs函数返回long类型参数n的绝对值。
div()
div_t div(int num,int denom)
div函数计算num/denom的商和余数,并把结果分别保存在结构类型div_t的两个int类型的成员quot和rem中。
ldiv()
ldiv_t ldiv(long num,long denom)
idiv 函数计算 num/denom 的商和余数,并把结果分别保存在结构类型 idiv_t 的两个long类型的成员quot和rem中。
assert.h
assert.h>中只有一个assert宏。
assert宏用于为程序增加诊断功能,形式如下:
void assert(int expression)
如果执行语句
assert(expression)
时,表达式的值为0,则assert宏将在stderr中打印一条消息,比如:
Assertion failed:表达式,file 源文件名,line 行号
打印消息后,该宏将调用abort终止程序的执行。其中的源文件和行号来自于预处理器宏FILE以及LINE。
如果定义了宏NDEBUG,同时又包含了头文件<assert.h>,则assert宏将被忽略。
ASSERT 只有在 Debug 版本中才有效,如果编译为 Release 版本则被忽略。
频繁的调用会极大的影响程序的性能,增加额外的开销。
每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
stdarg.h
int f1(char a,int n,…);省略号必须在末尾且前面必须接收一个整形表示几个参数
va_list get;声明储存参数变量;va_start(get,n);初始化get为参数列表
int one;double two;char three;one = va_arg(get,int);two = va_arg(get,double)
three = va_arg(get,char);依序获得变量,不可回退
va_end(get);清理工作;va_copy(getcopy,get)建立副本
setjmp.h
<setjmp.h>中的声明提供了一种不同于通常的函数调用和返回顺序的方式,特别是,它允许立即从一个深层嵌套的函数调用中返回。
<setjmp.h>定义了一宏setjmp()、一函数longjmp()、一变量jmp_buf
setjmp()宏
int setjmp(jum_buf env)
setjmp宏将状态信息保存到env中,供longjmp使用。如果直接调用setjmp,则返回值为0;如果是在 longjmp 中调用 setjmp,则返回值为非 0。setjmp 只能用于某些上下文中,如用于 if 语句、switch 语句、循环语句的条件测试中以及一些简单的关系表达式中。 例如:
if (setjmp(env) == 0)
/* get here on direct call /
else
/ get here by calling longjmp */
1
2
3
longjmp()函数
void longjmp(jmp_buf env, int val)
longjmp 通过最近一次调用 setjmp 时保存到 env 中的信息恢复状态,同时,程序重新恢复执行,其状态等同于 setjmp 宏调用刚刚执行完并返回非 0 值 val。包含 setjmp 宏调用的函数的执行必须还没有终止。除下列情况外,可访问对象的值同调用 longjmp 时的值相同:在调用 setjmp 宏后,如果调用 setjmp 宏的函数中的非 volatile 自动变量改变了,则它们将变成未定义状态。
direct.h
chdir()
int chdir(const char *path)
功能:把由path指定的目录改为当前目录。path参数中可以指定驱动器号,如“a:\ddd”, 但只是改变该驱动器上的当前目录,对当前活动驱动器上的当前目录无影响。
返回值:0(成功);-1(失败)
findfirst()和findnext()
调用方式:整形数=findfirst(文件名,&结构变量名,属性常数组合(如0x26));其中定义struct ffblk 结构变量名;
原形:`int findfirst(path,buffer,attr)和int findnext(buffer) `
char *path;//要检索的文件名
struct ffblk
{
char ff_reserved[21];
char ff_attrib;//被检索的文件属性
unsigned ff_ftime;//最后修改的时间
//(0-4位:秒数/2;5-10位:分数;11-15位:小时数)
unsigned ff_fdate;//最后修改的日期
//(0-4位:日;5-8位:月;9-15位:年减1980)
long ff_fsize;//文件大小
char ff_name[13];//组名
}*buffer;
int attr;//要检索的文件属性
功能:检索由path和attr指定的文件,把结果返回到buffer。findfirst返回关于第一个指定文件的信息,findnext继续检索。
返回值:0(检索成功),-1(没有找到指定的文件)
属性常数:
FA_NORMAL(0x00) 含意:Normal file, no attributes
FA_RDONLY(0x01) 含意:只读
FA_HIDDEN(0x02) 含意:隐含文件
FA_SYSTEM(0x04) 含意:系统文件
FA_LABEL(0x08) 含意:卷标
FA_DIREC(0x10) 含意:子目录
FA_ARCH(0x20) 含意:修改的文件Archive
fnmerge()
原形:void fnmerge(char *path,const char *drive,const char *dir, const char *name,const char *ext)
功能:建立文件路径函数,合成drive:\dir\name.ext,放在path
fnsplit()
原形:int fnsplit(char *path,const char *drive,const char *dir,const char *name,const char *ext)
功能:把文件名路径path分成4个部分存放。
其中drive中有冒号;dir中有开始和结尾的反斜杠;ext包括开始圆点
返回值:如果有扩展名,则 返回值&EXTENSION!=0
如果有文件名,则 返回值&FILENAME!=0
如果有目录名,则 返回值&DIRECTORY!=0
如果有驱动器号,则返回值&DIRVE!=0
getcurdir()
原形:int getcurdir(int drive,char directory)
drive=0(缺省);1(A驱动器);...
功能:读取指定驱动器的当前目录的函数,directory用来存放目录名,不包括驱动器名,不以反斜杠开始。
返回值:0(调用成功);1(出错)
getcwd()
原形:char *getcwd(char *buf,int buflen)
功能:读取当前目录的完整路径名(包括驱动器名),最长为buflen个字节,存放在buf中。如果buf为NULL,函数将分配一个buflen字节长的缓冲区,以后可将本函数的返回值作为free函数的参数来释放该缓冲区。
返回值:若buf非空,调用成功返回buf,出错返回NULL;若buf为NULL,返回指向已经分配的内存缓冲区地址。
getdisk()
原形:int getdisk(void)
功能:取得当前驱动器号(0=A;1=B;....)
mkdir()
原形:int mkdir(const char *path)
功能:按给定的路径建立一个新的目录
返回值:0(成功);-1(失败)
mktemp()
原形:char *mktemp(char *template)
功能:使用一个唯一的文件名来替换字符串template,并返回template。
rmdir()
原形:int rmdir(const char *path)
作用:删除目录函数,删除的目录不能是当前目录,不是根目录,是空目录
返回值:0(成功);-1(操作出错)
searchpath()
原形:char *searchpath(const char *file)
用法:p=searchpath("文件名"); 先定义char *p; 功能:搜索dos路径(环境变量中的path=....)来定位由file给出的文件。
返回值:指向完整路径名字符串的指针。定位失败返回NULL
searchpath()
原形:char *searchpath(const char *file)
用法:p=searchpath("文件名"); 先定义char *p; 功能:搜索dos路径(环境变量中的path=....)来定位由file给出的文件。
返回值:指向完整路径名字符串的指针。定位失败返回NULL。
segread()
原形:void segread(struct SREGS *segp)
作用:读段寄存器函数,把当前寄存器的值保存到SREGS型机构变量segp中。
segs.cs=代码段寄存器的值;
segs.ds=数据段寄存器的值;
segs.es=附加段寄存器的值;
segs.ss=堆栈段寄存器的值;
setdisk()
原形:int setdisk(int drive)
功能:把由drive指定的驱动器修改成当前驱动器,返回可使用的驱动器数。
settextstyle()
功能:设置当前输出英文字符的字体、大小和方向。
调用方式: void far settextstyle(int font,int direction,int charsize)
其中①参数font确定所选定的字体形状,
DEFAULT_FONT 或0 是8×8位图字体
TRIPLEX_FONT 或1 是三重矢量字体
SMALL_FONT 或2 是小号矢量字体
SANS_SERIF_FONT或3 是无衬线矢量字体
GOTHIC_FONT 或4 是哥特矢量字体
②参数durection字符的显示方向,
HORIZ_DIR 或0 是水平方向
VERT_DIR 或1 是垂直方向
③参数charsize表示字符放大的倍数,其值为0到10。
setvect()
setvect(int 中断号,void interrupt(*中断函数名))
功能:把中断服务程序的地址装入中断向量表中。
调用方法:setvect(中断号,中断函数名即地址);
(1)得预先定义要代替原函数的新函数
void interrupt 中断函数名(void) {......}
(2)得先保留原中断函数地址
void interrupt (*保留函数名)(void);
保留函数名=getvect(中断号);
(3)事后得将原中断函数地址装回向量表中 setvect(中断号,保留函数名);
setviewport()
原形:void far setviewport(int left,int top,int right,int bottom,int clip)
功能:用左上角坐标left,top和右下角坐标right,bottom建立一个视口,如果clip为1,则超出视口的输出自动被剪裁掉;如果clip为0,则不被剪裁。 例:setviewport(0,0,100,100,1)建立对角线为0,0和100,100的视口,并带有剪裁功能。
easyx.h
是c++文件,不能用malloc申请类的内存
不能直接输出数字
字符串一定要用const修饰
SRCAND()贴掩码图
SRCPAINT()贴背景图
静态库
常规设置lib文件,自身无法运行,需要其他项目调用(需要库里的头文件和自身一起复制到当前位置,愿意配环境变量也行)
pragma comment(lib,"MakeLib.lib")
动态库
设置dll文件,在程序运行时使用

浙公网安备 33010602011771号