printf 应用

来源:互联网 发布:linux u盘启动 windows 编辑:程序博客网 时间:2024/06/02 21:54

正点原子,一段串口程序:

voidu2_printf(char* fmt,...) 
    va_listap; //定义一具VA_LIST型的变量ap,这个变量是指向参数的指针
    va_start(ap,fmt);//初始化变量ap
    vsprintf((char*)USART2_TX_BUF,fmt,ap);//将变量ap,按照fmt格式,存在数组USART2_TX_BUF中
    va_end(ap); //用VA_END宏结束可变参数的获取
////////////////////////分割线//////////////////////////////////////////
    while(DMA1_Channel7->CNDTR!=0); //等待通道7传输完成  
    UART_DMA_Enable(DMA1_Channel7,strlen((constchar*)USART2_TX_BUF)); //通过dma发送出去
}

相关知识:

u2_printf(char* fmt,...) 类似于int printf(const char *fmt, ...); 

int printf(const char *fmt, ...);   //  逗号,后面,即第二个参数是三个点

printf()函数的调用格式为: printf("<格式化字符串>", <参量表>)。

目的:

方便输入可变参数。


va_list

VA_LIST 是在C语言中解决变参问题的一组宏。

vsprintf 的函数原型:
int vsprintf(char *string, char *format, va_list param);

//将param 按格式format写入字符串string中


总体上, 分割线前,就是把数据按照一定的格式保存在数组中。分割线后,发送数组中的数据。

函数特点:函数参数个数可变。


相关参考链接:

https://baike.baidu.com/item/va_list/8573665?fr=aladdin

https://baike.baidu.com/item/printf/7467706?fr=aladdin

https://zhidao.baidu.com/question/255040285.html


字符对应数据类型含义d / iint接受整数值并将它表示为有符号的十进制整数,i是老式写法ounsigned int无符号8进制整数(不输出前缀0)

u
unsigned int无符号10进制整数
x / X
unsigned int无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF(不输出前缀0x)
f(lf)
float(double)单精度浮点数用f,双精度浮点数用lf(尤其scanf不能混用)
e / E
double科学计数法表示的数,此处"e"的大小写代表在输出时用的“e”的大小写
g / G
double有效位数,如:%8g表示单精度浮点数保留8位有效数字。双精度用lg
c
char字符型。可以把输入的数字按照ASCII码相应转换为对应的字符
s / S
char * / wchar_t *字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符)
p
void *以16进制形式输出指针nint *到此字符之前为止,一共输出的字符个数,不输出文本
%
无输入
不进行转换,输出字符‘%’(百分号)本身
m无打印errno值对应的出错内容,(例: printf("%m\n"); )

原创粉丝点击