学习笔记|C语言中常用的函数及注意事项

#在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类型的,占了 1strlen(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);
			
			*/
  • 结果体数组

如上面的第二种方式,即为结构体数组

C语言编程注意事项 1. 每个程序一定包含main()函数, 尽管C语言函数命名没有限制。 2. printf函数永远不会自动换行, 只能用\n来实现, 回车键进行的换行在编译会出现错误信息。 3. 在vs2008等平台编译、测试要加 system("pause"); 来暂停dos自动退出引起的printf无法显示。 4. 所有自定义变量必须声明才能使用。 5. 每行一般只写一条语句, 在运算符两边加一个空格, 便于阅读。 6. 整数除法将会自动舍位, 不进行四舍五入的操作。 7. for(初始化部分;条件部分;增长部分) 比while 更适用于初始化和增长步长都是单条语句的情况。 8. 使用 #define 名字替换文本对部分"幻数" 赋予意义便于阅读 #define结尾无需;号来结束。 9. EOF(end of file)表示没有字符输入时定义在stdio.h 头文件 EOF不等于\n 换行等。 10. 由于!= 的优先级大于 = ,因此如果对判断存在变量赋值时 应对赋值加() 例如: while((c = getchar()) != EOF)。 11. getchar() 用于用户输入直至键入回车键。 12. 变量名以字母和数字组成, (下划线"_"被默认为字符, 以下划线为首写字母的为库类变量名), 变量常以小写字母开头,内部变量名前31位有效, 外部变量名至少前6位保持唯一性。 13.在C语言是区分字母大小写的。 14. 一个字符常量为一个整数, 用''单引号括起来。例如: '0' 为48, 它与0没有任何关系。 15. ANSI C语言的转义符: \a 响铃符; \b 回退符; \f 换页符; \n 换行符; \r 回车符; \t 横向制表符 ; \v 纵向制表符; \\ 反斜杠; \? 问号; \' 单引号; \" 双引号; \ooo 八进制数; \xhh 十六进制数; '\0' 表示0, 即(null)。 16. 'x'与"x"的区别: 'x'表示一个整数, 字母x在其字符集对应的数值, "x"表示包含一个字符x 以及一个结束符'\0'。 17. const在声明变量起限制作用, 该限定变量的值不能被修改。 18. %运算符不能应用于float或double类型。 19. char类型转换为int型时, 因为无法判断它是signed还是unsigned,这样其结果有可能为负数, 所以转换时尽量指定signed和unsigned限制符。 20. ++i与i++ 的不同之处: ++i是先 +1再使用i, i++ 是先使用i再 +1。 21. 三元运算符"?:" 第一个表达式的括号不是必须的, 但是由于三元表达式的优先级非常低, 因此我们还是将第一个表达式用()括起来以便于阅读和理解。 22. C语言可以使用递归 (即函数调用自身函数), 这样做并不节省储存空间也不加快执行速度, 只是使程序紧凑便于理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值