C语言中的格式化打印printf/sprintf以及嵌入式printf重定向进行DEBUG
一、printf描述
在C语言中,打印函数主要包括printf/sprintf/fprintf/snprintf等等,目的是将“给定的内容”按照“指定的格式”输出到“指定目标内”。通常要使用时,需要包括#inlcude <stdio.h>头文件。
用法为:void printf(const char *fmt, ...),其中“...”为可变参数列表,fmt为指定的输出格式,打印参数时用%来占位,根据百分号后边的具体内容来指定参数的格式。
常用格式如下:
%ld、%lu : d和u前面加l表示长整形;
%8d,%8u : d和u前面加一个常数N指定格式化后的字符串长度,实际长度小于N,以空格填充左边,实际长度大于N则忽略N;
%08d,%08u : 当实际长度小于N时,希望以0填充左边,则在N前加0;
%p : 显示指针的值
%e: 指数形式的浮点数
- printf("%d", value); 打印有符号十进制数:
- printf("%i", value); 打印有符号十进制数:
- printf("%u", value); 打印无符号十进制数:
- printf("%o", value); 打印无符号八进制数:
- printf("%x", value); 小写形式打印十六进制数: eg>1 2 e fa
- printf("%.2x", value); 小写形式打印十六进制数,不足2位左侧补零:eg> 02 ef
- printf("%X", value); 大写形式打印十六进制数:
- printf("%f", value); 打印浮点数:
- printf("%c", value); 打印ASCII单个字符
- printf("%.3f", value); 打印浮点数并保留小数点后3位
- printf("%s", str); 原样打印字符串:
- printf("%Ns", str); 打印指定长度的字符串, 超长时不截断, 不足时右对齐,N 为指定长度的10进制数值
- printf("%-Ns", str); 打印指定长度的字符串, 超长时不截断, 不足时左对齐,N 为指定长度的10进制数值
printf函数源码如下:
void printf(const char *fmt, ...)
{ char printf_buf[1024]; //可以放在外部,也可以放在函数内部 va_list args; //定义一个指针 argsva_start(args, fmt); //args指向fmt中的待转换参数(%)vsprintf(printf_buf, fmt, args); //调用vsprintf进行格式化打印va_end(args); //结束格式化打印puts(printf_buf); 输出
}
其中主要是用到了va_list,va_start,va_end,vsprintf,可以从stdarg.h中找到相关定义,va_arg(ap, type)是将ap指向的变量感召type类型进行返回。
#ifdef __clang__typedef __builtin_va_list va_list;#define va_start(ap, param) __builtin_va_start(ap, param)#define va_end(ap) __builtin_va_end(ap)#define va_arg(ap, type) __builtin_va_arg(ap, type)#if __STDC_VERSION__ >= 199900L || __cplusplus >= 201103L || !defined(__STRICT_ANSI__)#define va_copy(dest, src) __builtin_va_copy(dest, src)#endif
#else
在传参数时,参数的入栈顺序是从右向左,出栈时是从左向右,因此,当格式化字符串的百分号占位符与参数列表的个数不匹配时,将按照从右往左的顺序进行赋值。
二、重定向
根据前面的描述,可以对printf进行修改输出方式,例如,需要用串口作为debug,那么只需将printf格式化打印好的字符串送给串口进行输出即可。
void DEBUG_Printf(char *fmt, ...)
{ char buf[128];//不能太大,注意栈溢出,导致HardFalutva_list va_args;//声明va_start(va_args, fmt);//指针指向格式化字符vsnprintf((char *)buf, sizeof(buf), fmt, va_args);//调用stdarg.h中的vsnprintf转换va_end(va_args);//转换结束UART_SendString(USART2,buf);//将buf送到串口
}
三、设置编译开关
可以设置_DEBUG_开关来选择是否需要打印日志。
#define _DEBUG_ 1
#if _DEBUG_
#define MSG(...) DEBUG_Printf(__VA_ARGS__)
#else
#define MSG(...)
#endif
C语言中的格式化打印printf/sprintf以及嵌入式printf重定向进行DEBUG相关推荐
- c语言中的格式化字符串
C语言中格式字符串的一般形式为: % [ 标志 ][ 输出最小宽度 ][. 精度 ][ 长度 ] 类型 , 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符 ...
- Go中的格式化打印:“%+v”和“%v”的区别:
区别 :"%+v"会以字段键值对的形式key-value格式打印,"%v"只会打印字段值value信息 package mainimport ("fm ...
- 详述 Java 语言中的格式化输出
1 前言 相信大家在学习 Java 语言的时候,见到的第一条输出语句,就是: System.out.println("Hello World"); 毫无疑问,该语句的作用就是将He ...
- c语言中用于格式化输出的函数,C语言中格式化输入输出函数(转)
1.1.1 格式化输入输出函数 一.printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息.在编写程序时经常会用到此函数.printf()函数的调用格 ...
- c语言中输入格式带括号,C语言中printf()后的括号里面的怎么写,表示什么?...
int printf(const char *format,[argument]); format 参数输出的格式,定义格式为: %[flags][width][.perc] [F|N|h|l]typ ...
- C语言中不同格式化输出的含义(%e、%g、%u、%hd)等
%d:整型输出,%ld长整型输出 %o:以八进制数形式输出整数,打印的是无符号类型 %x:以十六进制数形式输出整数,%X以大写字母输出,打印的是无符号类型 %u:以十进制数输出unsigned型数据( ...
- c语言printf啥意思,printf在c语言中的意思是什么呢
在C语言中printf( )是专门用于输出的2113语句.5261 用法如下:1.printf()函数是格式化输出4102函数,一般用于向标准输出设备按1653规定格式输出信息.2.printf()函 ...
- C语言中几个字符串输出
printf 功能 c语言中产生格式化输出的函数(定义在 stdio.h 中).向终端输出(显示器等) 用法 int printf(const char *format,[argument]); fo ...
- C语言中的%f和%lf的区别
在C语言中用于格式化输入输出时: 整数值用%d; 实数(浮点数)用%f: float,单精度浮点型,对应%f. double,双精度浮点型,对应%lf. 即 %f 和 %lf分别对应float类型和d ...
最新文章
- myeclipse 遇到的一些问题及解决方案
- 【Python】如何在文件夹里批量修改文件名?(0001-1000)
- 阿里巴巴Java开发手册终极版
- Java_io体系之CharArrayReader、CharArrayWriter简介、走进源码及示例——13
- 使用Boxfuse为您的REST API设置https
- 同步应用(python 版)
- LeetCode 674 最长连续递增子序列
- MacOS如何设置多任务桌面
- 《深入浅出统计学》读书笔记
- 部分大学上演造假运动闯关本科评估(图)
- 分布式与微服务☞web组件kafka
- ros_多消息同步回调(Synchronizer)
- 【JavaSe】异常
- 微信小程序前端解密获取用户信息
- 数据结构(一):数据结构的概述
- 1.第三章 选择结构(一)
- 2口kvm切换器使用方法简述
- optimizer.step()代表什么意思
- 如何用“底层逻辑“看透世界的底牌?| 刘润最新演讲-学习总结
- 免费下载excel办公软件_Smartbi电子表格下载
热门文章
- 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法
- mac php oracle11g,Oracle11G函数整理
- 开源GIS解决方案,暨GeoServer+OpenLayer结合开发总结
- 网页中如何使用一些特殊字体
- VRP网络操作系统简介
- 关于gcc、glibc和binutils模块之间的关系
- Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析
- 如何在网页标题栏title加入logo(icon)图标?
- yum install nginx
- 设置Clover默认进入Windows,按快捷键F8可选择不同的引导