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文件,在程序运行时使用

posted @ 2023-02-23 20:14  bingcm  阅读(94)  评论(0)    收藏  举报