#在C语言代码中经常会用到以下标准C函数,如下:
- memcpy
memcpy函数与strcpy函数一样,都可以复制内容,但是一般是复制字符串以外的,如结构体等
功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
memcpy具体用法如下:
char src[] = "******************************";
char dest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";
memcpy(dest, src, strlen(src));
- strcpy
strcpy函数一般是用来复制字符串,并当遇到\0时会结束,不用指定复制的长度
功能:把从src地址开始且含有\0结束符的字符串复制到以dest开始的地址空间
strcpy具体用法如下:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name改变为"how are you ?
*strncpy
功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样只有遇到NULL才停止复制,而是多了一个条件停止,就是说如果复制到第n个字符还未遇到NULL,也一样停止),返回指向dest的指针。
strncpy具体用法如下:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strncpy(name,p, sizeof(name));//name改变为"how are you ?"
以上如果要复制内容可以使用上面的几个函数
- memset
void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节替换为ch并返回s;
功能:清零操作或填充值
如下:
uchar szRecvBuf[2*1024];
memset(szRecvBuf,0x00,2048);
- strcmp
比较
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strcmp(name,p)==0
- strcat
连接
char name[[15]="hello"
char BleServerMac[20]="00:a0:50:13:09:24";
strcat(btname,BleServerMac+12)//将MAC地址的后四位连接在btName后面
- strlen,sizeof
sizeof:统计字符串所占空间大小
strlen:统计字符串长度,以\0为结束符,不包含\0
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
-
static关键字
static关键字一般修饰的是变量和函数名
注意:被static关键字修饰的变量和函数名只能在本文件.c中使用
如下:
helloworld.c中想调用public.c中的变量和函数时,public.c中被另一个.c调用的变量和函数不能定义为static,并需要写一个public.h,定义那些函数及变量,并在helloworld.c中将该头文件包含
helloworld.c
#include <public.h>
static void helloworld()
{
int sum = 0;
printf ("%s",result);
sum = SUM(2,3); //调用public.c中的函数SUM
}
public.c
int result = 7; //不能定义为static
int SUM(int a,int b) //不能定义为static
{
int total;
total = a + b;
return total;
}
public.h
int result;
int SUM(int a,int b);
-
#include <>和“ ”的区别
<> 先在系统的目录中查找头文件,系统的头文件中找不到后再在当前目录下查找,系统路径就是 Tools -》 settings -》directories
“ ”现在当前文件下查找,查找不到后再在系统目录下查找
-
typedef
struct data / *定义结构体* /
{
int day;
int month;
int year;
} ;
struct stu /*定义结构体* /
{
char name[20];
long num;
struct data birthday; /嵌*套的结构体类型成员*/
};
上面的结构体等价于
typedef struct
{
char name[20];
long num;
struct data birthday; /嵌*套的结构体类型成员*/
}stu;
即在上面的stu相当于struct stu,typedef作用是替代,用stu来替代struct stu
但是注意:
如果使用了typedef时,声明变量可以直接stu S1;
而如果没有使用typedef,声明变量时struct stu S1;
-
结构体指针
如上面的结构体,使用时可以定义如下:
struct stu *student; /*结构体类型指针*/
student=malloc(sizeof(struct stu)); /* 指针变量分配安全的地址*/
free(student); //用完之后需要释放空间
指针所指各成员形式为:
student->name
student->num
student->birthday.year
student->birthday.month
student->birthday.day
另结构体指针的用法如下
typedef struct
{
BT_STATE State; /*bluetooth state*/
int Err; /*bluetooth (last) error code*/
} ST_BT_STATUS;
原 型
int BluetoothCheck(ST_BT_STATUS *Status);
1、/*
static ST_BT_STATUS *Status = NULL;
Status = (ST_BT_STATUS*)malloc(sizeof(ST_BT_STATUS));
ret = BluetoothCheck(Status);
ASSERT(Status->State==BT_STATE_OPENED, "ret=%d,Status = %d", ret,Status->State);
free(Status);
*/
2、/*
static ST_BT_STATUS Status[30] ;
ret = BluetoothCheck(Status);
ASSERT(Status->State==BT_STATE_OPENED, "ret=%d,Status = %d", ret,Status.State);
*/
3、/*
static ST_BT_STATUS Status ;
ret = BluetoothCheck(&Status);
ASSERT(Status.State==BT_STATE_OPENED, "ret=%d,Status = %d", ret,Status.State);
*/
- 结果体数组
如上面的第二种方式,即为结构体数组