目录
一、函数作用
二、输出内容的格式化处理
1.输出变量的类型
2.输出变量的位数
小数:
整数:
16 进制:
在做蓝桥杯第五届国赛试题的时候,遇到这样一个问题:题目要求单片机通过串口返回电脑一组数据,包括温度、湿度、时间等,数据很多问且中间有大括号等符号做间隔,如果一个字符一个字符的分开重新定义,发送的话就非常麻烦。通过上网学习,发现了一个非常有效的办法:sprintf()函数来实现。但是,在C51中的sprintf函数与标准C语言中有所差别,注意区分。经过上网查阅资料,特此总结一下。
首先,用这个函数的时候,前面要加上这个头文件:#include
sprintf() 是格式化输出函数,保存字符串到缓冲区中,起到拼接字符串的作用。
函数介绍: int sprintf(char *str, const char *format, ...);
参数: str: 数据缓冲区,通常是一个字符串数组
format:输出的内容
举个例子:
int a = 10;
char buf[100] = {0};
sprintf(buf,"a = %d\n",a);
作用:将a的值放置到%d的位置,然后"a = 10\n"这句话保存到数组buf中。
说明:函数sprintf()的用法和printf()函数一样,只是sprintf()函数给出第一个参数string(一般为字符数组,用来存储字符串),起到拼接字符串的作用。
又例如:
sprintf(s, "%d", 123); //产生"123" 把整数123 打印成一个字符串保存在s 中。
对于输出的内容,还要对他进行格式化的处理,也就是上面例子中双引号内的部分。
b 表示字节数据;
bd 表示 8 位有符号整数(256)(KEIL里扩展出了b,h,l来对输入字节宽的设置:b八位(256);h十六位(65535);l三十二位);
bu 表示 8 位无符号整数;
bx 表示 8 位十六进制整数;
小数用f表示。
自己控制打印的宽度和小数位数,这时就应该使用:“%m.nf”格式,其中m表示打印内容的总宽度,字符串长度不足时补空格,超出了则按照实际宽度打印;n表示小数点后的位数,也就是从相应的字符串中最多取用的字符数。比如:
sprintf(Tx_buf1, "%10.3f\r\n", 3.1415626); // 产生:" 3.142″ 空格在左面产生
sprintf(Tx_buf1, "%-10.3f\r\n",3.1415626); // 产生:"3.142 " 空格在右面产生
sprintf(Tx_buf1, "%.3f\r\n", 3.1415626); // 不指定总宽度,产生:"3.142"
UART_TX(Tx_buf1);
也是使用:“%m.nf”格式。m.n m:打印内容的总宽度,字符串长度不足时补空格,超出了则对于输出整数:按照实际宽度打印;n: 总共输出几位整数,位数不够在前面加0,超出位数输出原数。
sprintf((char*)Tx_buf1,"{%bd-%bd%%}{%0.2bd-%0.2bd-%0.2bd}{%bd}\r\n",wendu,shidu,shijian[2],shijian[1],shijian[0],kaojin_flag);
//sprintf((char*)Tx_buf1,"{%bd-%bd%%}{%0.1bd-%0.2bd-%0.3bd}{%bd}\r\n",wendu,shidu,shijian[2],shijian[1],shijian[0],kaojin_flag);
//sprintf((char*)Tx_buf1,"{%bd-%bd%%}{%0.3bd-%0.2bd-%0.1bd}{%bd}\r\n",wendu,shidu,shijian[2],shijian[1],shijian[0],kaojin_flag);
//sprintf((char*)Tx_buf1,"{%bd-%bd%%}{%2.2bd-%2.2bd-%2.2bd}{%bd}\r\n",wendu,shidu,shijian[2],shijian[1],shijian[0],kaojin_flag);
//sprintf((char*)Tx_buf1,"{%bd-%bd%%}{%3.2bd-%3.2bd-%3.2bd}{%bd}\r\n",wendu,shidu,shijian[2],shijian[1],shijian[0],kaojin_flag);
测试结果:
0.2 0.2 0.2 三个变量都是两位数,不够前面加0
0.1 0.2 0.3 {23-59-059} {0-00-000} 第一个一位数,第二个两位数,第三个三位数;不够三位数前面补零;超过一位数输出原数
0.3 0.2 0.1 {023-59-59} {000-00-0} 第一个三位数,第二个两位数,第三个一位数;不够三位数前面补零;超过一位数输出原数
由此可见,n:总共输出几位整数,位数不够在前面加0;超过位数输出原数
2.2 2.2 2.2 {23-59-59} {00-00-00} 三个变量都是两位数,不够前面加0
3.2 3.2 3.2 { 23- 59- 59} { 00- 00- 00} 字符串长度不足时补空格,超出了则按照实际宽度打印
sprintf(Tx_buf1,"%8x\r\n",4567); // 产生:" 11d7″ 总共8位字符,空格在左面产生,16进制小写
sprintf(Tx_buf1,"%-8X\r\n",4567); // 产生:"11D7 ″ 总共8位字符,空格在右面产生,16进制大写
参考:
sprintf %m.ns %m.nf_mydriverc2的博客-CSDN博客_sprintf ”%m.nf”