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’而停止