2021寒假专题5
该专题介绍C语言库函数中
远端跳转、信号处理、变参支持、常用宏以及stdlib.h的内存管理、终止程序、执行命令、环境变量
include <setjmp.h>
#include <stdio.h>
//非局部跳转 跨函数跳转 在没有函数调用关系的情况下跳转
//局部跳转:if while switch goto
//setjmp 设置
//longjmp 开始执行跳转
//参数:jmp_buf
//当函数嵌套多层a->b->c->d,从d需要直接返回a时,longjmp可以避免多次返回值
enum
{
first,second,third
};
jmp_buf env;
void study(int num2)
{
if(num2>=10)
{
printf("Good");
return;
}
else
{
longjmp(env,1);
}
}
void deal(int num)
{
study(num*2);
return;
}
int main()
{
int num;
switch(setjmp(env))
{
case first:
printf("请输入一个数:");
scanf("%d",&num);
deal(num);
break;
case second:
printf("游戏结束");
}
}
include <signal.h>
#include <stdio.h>
//信号处理含义
//程序如何发出信号
//如何忽略信号
//如何定制收到信号的处理办法
//有哪些信号
void deal()
{
for(int i=11;i<20;i++)
{
printf("%d\n",i);
if(i==15) raise(SIGINT);
}
}
int main()
{
//raise 发出信号
//signal(SIGINT,SIG_IGN) //忽略信号,括号前面是忽略的信号,括号后面是SIG_IGN(ignore)
signal(SIGINT,SIG_IGN);//定义在函数内部也可以终止其他函数相同的信号,但只能终止出现在定义后的该信号
signal(SIGINT,SIG_DFL); //该行代码让信号恢复默认作用
deal();
for(int i=0;i<10;i++)
{
printf("%d\n",i);
if(i==5) raise(SIGINT);//程序自杀,后面整个程序也不会执行 ,
}
printf("hello world");
//
}
include <stdarg.h>
//可变参数
//最熟悉的printf就是可变参数
#include <stdio.h>
void str(int num,...)
{
va_list list;
va_start (list,num);
for(int i=0;i<num;i++)
{
char* res;
res=va_arg(list,char*);
printf("%s",res);
}
}
int sum(int count,...)//避免了数组的使用
{
int res=0;
va_list list; //list链表用来存储第一个参数的地址,用于后续的偏移
va_start(list,count);//取可变参数做准备,将第一个参数地址放入链表里,参数后不可再有其它参数
//访问的个数不能超过可变参数的个数
for(int i=0;i<count;i++)
{
res+=va_arg(list,int); //从链表里获取首地址,然后根据第二个参数进行偏移
}
return res;
}
int main()
{
str(2,"hello","world");
printf("%d\n",sum(4,1,2,3,9));
}
include <stddef.h> (学完发现没什么好讲的)
//常用宏(包括bool宏)
#include <stdio.h>
//#include <stdbool.h>
int main()
{
printf("%d\n",__LINE__);//被编译文件的行号
printf("%s\n",__FILE__);//被编译的文件名
printf("%s\n",__DATE__);//编译的日期
printf("%s\n",__TIME__);//编译的时间
printf("%d\n",__STDC__);//符合C标准,为1
printf("%d\n",true);//1为真,0为假
printf("%d\n",false);
}
include <stdlib.h>
#include <stdio.h>
//realloc calloc malloc
//非正常终止 abort();
// 执行程序 system
//环境变量 getenv
void deal()
{
printf("hello");
}
void with()
{
printf("world ");
}
int main()
{
printf("你猜我打印什么\n");
//atexit() 注册回调函数 参数为函数名,exit终止前(无exit仍然可用)调用这个函数,且可以注册多个
//atexit(deal);
//atexit(with);
//system("pause");
//atexit后定义的先执行
//正常终止 exit(0);
//exit(0);
//system函数,对系统操作台控制,建议在需要某功能的时候查找,指令不区分大小写
//system("notepad");
//ASSOC 显示或修改文件扩展名关联。
//AT 计划在计算机上运行的命令和程序。
//ATTRIB 显示或更改文件属性。
//BREAK 设置或清除扩展式 CTRL+C 检查。
//CACLS 显示或修改文件的访问控制列表(ACLs)。
//CALL 从另一个批处理程序调用这一个。
//CD 显示当前目录的名称或将其更改。
//CHCP 显示或设置活动代码页数。
//CHDIR 显示当前目录的名称或将其更改。
//CHKDSK 检查磁盘并显示状态报告。
//CHKNTFS 显示或修改启动时间磁盘检查。
//CLS 清除屏幕。
//CMD 打开另一个 Windows 命令解释程序窗口。
//COLOR 设置默认控制台前景和背景颜色。
//COMP 比较两个或两套文件的内容。
//COMPACT 显示或更改 NTFS 分区上文件的压缩。
//CONVERT 将 FAT 卷转换成 NTFS。您不能转换当前驱动器。
//COPY 将至少一个文件复制到另一个位置。
//DATE 显示或设置日期。
//DEL 删除至少一个文件。
//DIR 显示一个目录中的文件和子目录。
//DISKCOMP 比较两个软盘的内容。
//DISKCOPY 将一个软盘的内容复制到另一个软盘。
//DOSKEY 编辑命令行、调用 Windows 命令并创建宏。
//ECHO 显示消息,或将命令回显打开或关上。
//ENDLOCAL 结束批文件中环境更改的本地化。
//ERASE 删除至少一个文件。
//EXIT 退出 CMD.EXE 程序(命令解释程序)。
//FC 比较两个或两套文件,并显示同处。
//FIND 在文件中搜索文字字符串。
//FINDSTR 在文件中搜索字符串。
//FOR 为一套文件中的每个文件运行一个指定的命令
//FORMAT 格式化磁盘,以便跟 Windows 使用。
//FTYPE 显示或修改用于文件扩展名关联的文件类型。
//GOTO 将 Windows 命令解释程序指向批处理程序中某个标明的行。
//GRAFTABL 启用 Windows 来以图像模式显示扩展字符集。
//HELP 提供 Windows 命令的帮助信息。
//IF 执行批处理程序中的条件性处理。
//LABEL 创建、更改或删除磁盘的卷标。
//MD 创建目录。
//MKDIR 创建目录。
//MODE 配置系统设备。
//MORE 一次显示一个结果屏幕。
//MOVE 将文件从一个目录移到另一个目录。
//NOTEPAD 启用记事本
//PATH 显示或设置可执行文件的搜索路径。
//PAUSE 暂停批文件的处理并显示消息。
//POPD 还原 PUSHD 保存的当前目录的上一个值。
//PRINT 打印文本文件。
//PROMPT 更改 Windows 命令提示符。
//PUSHD 保存当前目录,然后对其进行更改。
//RD 删除目录。
//RECOVER 从有问题的磁盘恢复可读信息。
//REM 记录批文件或 CONFIG.SYS 中的注释。
//REN 重命名文件。
//RENAME 重命名文件。
//REPLACE 替换文件。
//RMDIR 删除目录。
//SET 显示、设置或删除 Windows 环境变量。
//SETLOCAL 开始批文件中环境更改的本地化。
//SHIFT 更换批文件中可替换参数的位置。
//SORT 对输入进行分类。
//START 启动另一个窗口来运行指定的程序或命令。
//SUBST 将路径跟一个驱动器号关联。
//TIME 显示或设置系统时间。
//TITLE 设置 CMD.EXE 会话的窗口标题。
//TREE 以图形模式显示驱动器或路径的目录结构。
//TYPE 显示文本文件的内容。
//VER 显示 Windows 版本。
//VERIFY 告诉 Windows 是否验证文件是否已正确写入磁盘。
//VOL 显示磁盘卷标和序列号。
//XCOPY 复制文件和目录树。
//COLOR [attar]
// attar 指定控制台输出的颜色属性
//颜色属性由两个十六进制的数字指定 -- 第一个为背景,第二个为前景(字体)。每个数字可以为以下任何值之一:
// 0 = 黑色 8 = 灰色
// 1 = 蓝色 9 = 淡蓝色
// 2 = 绿色 A = 淡绿色
// 3 = 浅绿色 B = 淡浅绿色
// 4 = 红色 C = 淡红色
// 5 = 紫色 D = 淡紫色
// 6 = 黄色 E = 淡黄色
// 7 = 白色 F = 亮白色
printf(getenv("PATH"));
//getenv()参数是一个字符型指针,返回一个字符型指针
//环境变量具体值在“我的电脑”属性里面,有待学习
}
这些知识都是入门级别,这里算是开个头,以后有待进一步学习

浙公网安备 33010602011771号