复习C语言随笔 七
函数
- 1 isdigit()
检查字符是否为数字字符。若是,返回非0;否,返回0。头文件: stdlio.h 。
- 2 memset(void *buffer, int ch, size_t count )
函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。 memset() 可以应用在将一段内存初始化为某个值。头文件: string.h 。例如:
memset( the_array, '\0', sizeof(the_array);
特殊用法: 将整型数组初始化为0
#include<stdio.h>
#include<string.h>
int main(){
int a[10], i;
memset(a,0,40);
for(i=0; i<sizeof(a)/sizeof(a[0]); i++) printf("%d ",a[i]);
return 0;
}
3 strlen()
遇到ASCLL码0结束,或者说遇到’\0’ 。
‘0’ –48
‘\0’ –0
NULL –04 static 修饰变量
修饰全局变量 改变链接属性
修饰局部变量 改变生命周期
修饰函数 改变链接属性
数组
#include<stdio.h>
int main(){
char arr1[] = "abc";
char arrr2[] = {'d', 'e', 'f'};
char *p1 = "xyz"; // xyz 放在只读数据区,分配内存, p1指向x
char *p2 = "xyz"; // 没有分配内存 , p2指向x
return 0;
}
一句话
c语言编译器在编译时会对变量进行重命名。当使用变量或函数时未定义或写错了变量名或函数名,会报错: 无法解析。。。。XXXXX ,此处的XXXXX是编译器处理之后的名字,而在源码中并没有出现XXXXX 。
源码的保护
在平时的学习过程中,一个程序的代码基本上都是放在一个.c文件中,比如下面的例子:
然而在开发时,这样做有一个十分明显的弊端: 泄露源码 ———这对于开发者而言造成的经济损失的难以估量的。 所以,就可以通过把源码中各种函数生成为静态库的方式进行源码保护。
第一步:对源码进行主函数与自定义函数的分离
以这里的函数 PrintAB() 为例: 先在头文件的文件夹下创建 PrintAB.h 文件,声明PrintAB()函数
然后在源文件里创建一个 PrintAB.c 文件用 #include”PrintAB.h”引用刚刚创建的头文件,并完成函数PrintAB() 的定义:
接着在源代码里写上对头文件 PrintAB 的引用,此时就完成了分离操作。编译并运行代码,完美!
第二步:创建静态库
首先新建一个空项目,为了辨识,项目名取为PrintAB。
然后将项目123(这里是用项目123演示的)里的printAB.c和PrintAB.h拷贝到项目PrintAB下:
在项目 PrintAB 中将 .h 文件移动到头文件文件夹中,然后找到该项目的属性页,在配置属性–>常规–>项目默认配置–>配置类型 一栏,选择静态库(.lib) ,应用,确认。
然后F7生成解决方案,可以看到生成了一个 PrintAB.lib 文件:
第三步:使用静态库
这个 .lib 文件打开之后是一堆乱码,对于人类而言是完全看不懂的,只有在代码中能使用它。 现在复制 PrintAB.lib 文件到项目123下并删除原有的PrintAB.c文件:
然后在项目123的test.c文件(也就是写有主函数的那个文件)里加上 #pragma comment(lib, “PrintAB.lib”) 以完成对lib文件的引用。此时编译并运行,运行成功!
可以看到,在项目123中已经没有了对函数PrintAB的定义,但是程序仍然跑起来了。在实际开发环境中,对外放出去的代码就是项目123中的代码,而属于自己的‘生产资料’则保存在自己本地。