C语言小技巧

sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,…]);,主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。解决这个问题,可以考虑使用 snprintf函数,该函数可对写入字符数做出限制。

sprintf()最常见的应用之一莫过于把整数打印到字符串中,如:

u8 ADC_Ch[2][4];
sprintf((char*)ADC_Ch[j],"ch%d=%4d",j,Average[j]);//将Average[0],Average[1]分别打印到数组ADC_Ch[0]和ADC_Ch[1]地址开始的地方
sprintf(s, "%d", 123);  //把整数123打印成一个字符串保存在s中
sprintf(s, "%8x", 4567);  //小写16进制,宽度占8个位置,右对齐

实验中:
发送端:

void ShowCH_Voltage(void)
{
	int i=0,j=0;
	float SUM;
	for(j=0;j<M;j++)//M,通道个数
	 { 
		for(i=0;i<N;i++)//N,每个通道采样次数
		 {
	      SUM+=AD_Value[i][j]; //每个通道的数据求和,注意是二维数组的每列的数据求和
		 }
		Average[j]=SUM/N; //再取平均
		LCD_ShowxNum(160,200+30*j,Average[j],4,24,0);//显示ADC值
		sprintf((char*)joystickcar.ADCVAL[j],"%4d",Average[j]);//将Average[0],Average[1]分别打印到数组joystickcar.ADCVAL[0]和joystickcar.ADCVAL[1]地址开始的地方。
		LCD_ShowString(10,200+30*j,239,24,24,joystickcar.ADCVAL[j]);	
		SUM=0;//开众提醒置零
	 } 
}

其中当ADC值不是四位数时,就会用空格替代,比如2012 3,所以接收端收到空格,而不是0,需要将字符串再变成数字ADC值,需要注意,详细见接收端注释

sprintf((char*)joystickcar.ADCVAL[j],"%4d",Average[j]);//将Average[0],Average[1]分别打印到数组joystickcar.ADCVAL[0]和joystickcar.ADCVAL[1]地址开始的地方。

接收端:

if(NRF24L01_RxPacket(tmp_buf)==0)//接收到信息存到tmp_buf
		{
			LCD_ShowString(0,195,239,32,16,tmp_buf);//测试用,显示字符串	
			//将8位的字符串转换为两个四位数
			for(i=0;i<8;i++)
			{
				if(tmp_buf[i]>'0')//将每个字符转换为数字
				{
				  t[i]=tmp_buf[i]-'0';//因为当不是四位数时有空格,空格的ASSIC<‘0’
				}
				else
				{
					t[i]=0;
				}
				LCD_ShowNum(200,70+i*16,t[i],3,16);	//测试用,显示转换过来的单个数字
			}
			DuoDian.L_R_duoji=t[0]*1000+t[1]*100+t[2]*10+t[3];//转换为4位数
			DuoDian.F_B_dianji=t[4]*1000+t[5]*100+t[6]*10+t[7];//转换为4位数

			LCD_ShowNum(100,80,DuoDian.L_R_duoji,8,16);	//显示4位数,控制舵机的ADC值
			LCD_ShowNum(100,100,DuoDian.F_B_dianji,8,16);	//显示4位数,控制电机的ADC值

c语言中%d与%4d的区别
测试%d与%4d的区别,%d是按照原型输出,有多少位就有多少位,另外c语言中数据的宽度是从右边开始算起的,比如%4d就表示数据宽度为4,不够的那空格来补,如果超出四位,则应该原型输出
包含头文件
#include <string.h>
,<>比“ ”的优先级更高,首先在<>头文件查找函数
**void memset(void s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

memset(str,0,22);//对str前22个位置清0 

注意:实质是负责,是用int型数据0初始化指定长度内存,而不是字符‘0’

“字符串数组不是最好用’\0’进行初始化吗?那么可以用 memset 给字符串数组进行初始化吗?也就是说参数 c 可以赋值为’\0’吗?”
可以的。虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 ‘\0’ 和 0 是等价的,因为字符 ‘\0’ 在内存中就是 0。所以在 memset 中初始化为 0 也具有结束标志符 ‘\0’ 的作用,所以通常我们就写“0”。
所以,如果用其他字符初去始化,输出数组时,会把数组的全部字符输出,而不会应遇到字符串结束符 '\0’而停止

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值