我的第一个程序---2048小游戏的准备阶段(涉及到的未接触知识点)

知识点:

1.通过printf设置linux终端输出的颜色和显示方式

在linux终端下调试程序时,有时需要输出大量信息。若能控制字体颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据。
终端的字符颜色由转义序列控制,是文本模式下的系统显示功能,与具体的语言无关。

转义序列以控制字符‘esc’开头,该字符的ascll码为\033。多数转义字符序列超过两个字符,所以通常以‘esc’和左括号‘[’开头。该起始序列称为控制序列引导符,通常以‘\033[’或’\e['表示。
通过转义序列设置终端显示属性时,可采用以下格式:

\033[属性值;…m
或者
\e[属性值;…m

其中,\033[或\e[引导转义序列,‘m’表示设置属性并结束转义序列。
例如:
在这里插入图片描述
即设置输出为红色字体(31),紫色背景(45)。参数-e为echo命令激活特殊字符的解析器。
转义序列相关的常用参数如下:

显示:0(默认)、1(粗体/亮体)、22(非粗体)、4(单条下划线)、24(无下划线)、5(闪烁)、25(无闪烁)、7(反显、翻转前景色和背景色)、27(无返显)
颜色:0(黑)、1(红)、2(绿)、3(黄)、4(蓝)、5(洋红)、6(青)、7(白)

前景色为30+颜色,后景色为40+颜色。

通过转义序列设置终端显示属性时,格式为:
\033[显示方式;前景色;后景色m输出\033[0m
或者
\e[显示方式;前景色;后景色m输出\033[0m

其中,\033[0m用于恢复默认的终端输出属性,否则会影响后续的输出。
此外还有一些ansi的控制码:

如:
nA—光标上移n行
nB—光标下移n行
nC—光标右移n行
nD—光标左移n行
2J—清屏
K—清除从光标到行尾的内容
s—保存光标位置
u—恢复光标位置
y;xH—设置光标位置
?25l—隐藏光标
?25h—显示光标



2.signal()函数

头文件signal.h

signal(参数1,参数2);
参数1;:要进行处理的信号。系统的信号可以在终端输入kill -l来查看(64个)。其实这些信号是系统定义的宏。
参数2:处理的方式。

有3中处理方式(这里只谈论前两种):
1:signal(SIGINT,SIG_ING);
SIG_ING表示忽略SIGINT信号,SIGINT信号由interruptkey产生,通常是ctrl+c或DELETE。

如:
#include
#include
int main()
{
signal(SIGINT,SIG_ING);
for(;; );
return 0;
}

执行该程序,按下ctrl+c程序没有反应。如果想要结束该程序可以ctrl+/。其实ctrl+/时,是产生了SIGQUIT信号。
2:signal(SIGNINT,SIG_DFL)
SIG_DFL表示执行系统默认操作,其实对于大多数信号的系统默认动作是终止该进程。这与不写此函数是一样的。

如:
#include
#include
int mian()
{
signal(SIGINT,SIG_DFL);
for(;; );
return 0;
}

这时ctrl+c可以终止进程,把signal(SIGINT,SIG_DFL);这句去掉,效果是一样的。



3.进程挂起函数sleep()和usleep()

sleep()和usleep()的参数都是一个整数,sleep()是暂停多少秒,usleep()是暂停多少微秒。
1秒=1000毫秒,1毫秒=1000微妙。

如:
程序暂停50毫秒------usleep(50000)

此外,这个暂停的时候不可能时百分之百的准确,跟系统的调度、cpu时钟周期等有一定关系。



4.snprintf函数使用总结

头文件:stdio.h
函数原型:int snprintf(char *str,size_t size,const char *format,…)
参数:str:目标字符串,size:拷贝字节数,format:原字符串,…:格式
功能:最多从原字符串format中拷贝size字节的内容(含\0)到字符串。
返回值:成功返回原串的长度,失败返回负值。

三种情形:
1:原串小于目标字符串
#include
#include
int main()
{
char a[10];
int i,ret;
memset(a,1,sizeof(a));
for(i=0;i<10;i++)
printf(“a[%d]=%d\t”,i,a[i]);
ret=snprintf(a,10,"%d",123);
printf("\nret=%d\n",ret);
for(i=0;i<10;i++)
printf(“a[%d]=%d\n”,i,a[i]);
return 0;
}

我的第一个程序---2048小游戏的准备阶段(涉及到的未接触知识点)_第1张图片

2:原串等于目标字符串
#include
#include
int main()
{
char a[10];
int i,ret;
memset(a,1,sizeof(a));
for(i=0;i<10;i++)
printf(“a[%d]=%d\t”,i,a[i]);
ret=snprintf(a,10,"%s",“abcdefghi”);
printf("\nret=%d\n",ret);
for(i=0;i<10;i++)
printf(“a[%d]=%d”,i,a[i]);
return 0;
}

我的第一个程序---2048小游戏的准备阶段(涉及到的未接触知识点)_第2张图片

3:原串大于目标字符串
#include
#include
int main()
{
char a[10];
int i,ret;
memset(a,1,sizeof(a));
for(i=0;i<10;i++)
printf(“a[%d]=%d\t”,i,a[i]);
ret=snprintf(a,10,"%s",“abcdefghigklmnopq”);
printf("\nret=%d\n",ret);
for(i=0;i<10;i++)
printf(“a[%d]=%d\t”,i,a[i]);
return 0;
}
我的第一个程序---2048小游戏的准备阶段(涉及到的未接触知识点)_第3张图片

会有一个警告,提示你越界了。



5.无符号整型的typedef

在代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看, 好像是个新的数据类型,不过C语言里面好像没有这种数据类型啊!很多人有这样的疑问。论坛上就有人问: 以*_t结尾的类型是不是都是long型的?在baidu上查一下,才找到答案,这时才发觉原来自己对C掌握的太少。

那么_t的意思到底表示什么?具体的官方答案没有找到,不过我觉得有个答案比较接近。它就是一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型。

uint8_t,uint16_t,uint32_t等都不是什么新的数据类型,它们只是使用typedef给类型起的别名,新瓶装老酒的把戏。不 过,不要小看了typedef,它对于你代码的维护会有很好的作用。比如C中没有bool,于是在一个软件中,一些程序员使用int,一些程序员使用 short,会比较混乱,最好就是用一个typedef来定义,如:
typedef char bool;



6.Linux串口编程

这部分博主还没有研究,后续会加上补充的。



好了,对于这个程序所需的曾经未接触的知识对于博主来说就是这么多了,希望对你有所帮助。

你可能感兴趣的:(我的第一个程序---2048小游戏的准备阶段(涉及到的未接触知识点))