使用sprintf()函数在C51中的优雅实现

 

目录

一、函数作用

二、输出内容的格式化处理

1.输出变量的类型

2.输出变量的位数

小数:

整数:

16 进制:


  在做蓝桥杯第五届国赛试题的时候,遇到这样一个问题:题目要求单片机通过串口返回电脑一组数据,包括温度、湿度、时间等,数据很多问且中间有大括号等符号做间隔,如果一个字符一个字符的分开重新定义,发送的话就非常麻烦。通过上网学习,发现了一个非常有效的办法:sprintf()函数来实现。但是,在C51中的sprintf函数与标准C语言中有所差别,注意区分。经过上网查阅资料,特此总结一下。

首先,用这个函数的时候,前面要加上这个头文件:#include <stdio.h>

一、函数作用

  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 中。

二、输出内容的格式化处理

对于输出的内容,还要对他进行格式化的处理,也就是上面例子中双引号内的部分。

1.输出变量的类型

  b 表示字节数据;

  bd 表示 8 位有符号整数(256)(KEIL里扩展出了b,h,l来对输入字节宽的设置:b八位(256);h十六位(65535);l三十二位);

  bu 表示 8 位无符号整数;

  bx 表示 8 位十六进制整数;

  小数用f表示。

2.输出变量的位数

小数:

  自己控制打印的宽度和小数位数,这时就应该使用:“%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} 字符串长度不足时补空格,超出了则按照实际宽度打印

16 进制:

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”

物联沃分享整理
物联沃-IOTWORD物联网 » 使用sprintf()函数在C51中的优雅实现

发表评论