一、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: 指数形式的浮点数

  1. printf("%d", value); 打印有符号十进制数:
  2. printf("%i", value); 打印有符号十进制数:
  3. printf("%u", value); 打印无符号十进制数:
  4. printf("%o", value); 打印无符号八进制数:
  5. printf("%x", value); 小写形式打印十六进制数: eg>1 2 e fa
  6. printf("%.2x", value); 小写形式打印十六进制数,不足2位左侧补零:eg> 02 ef
  7. printf("%X", value); 大写形式打印十六进制数:
  8. printf("%f", value); 打印浮点数:
  9. printf("%c", value); 打印ASCII单个字符
  10. printf("%.3f", value); 打印浮点数并保留小数点后3位
  11. printf("%s", str); 原样打印字符串:
  12. printf("%Ns", str); 打印指定长度的字符串, 超长时不截断, 不足时右对齐,N 为指定长度的10进制数值
  13. 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相关推荐

  1. c语言中的格式化字符串

    C语言中格式字符串的一般形式为:  % [ 标志 ][ 输出最小宽度 ][. 精度 ][ 长度 ] 类型 , 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符 ...

  2. Go中的格式化打印:“%+v”和“%v”的区别:

    区别 :"%+v"会以字段键值对的形式key-value格式打印,"%v"只会打印字段值value信息 package mainimport ("fm ...

  3. 详述 Java 语言中的格式化输出

    1 前言 相信大家在学习 Java 语言的时候,见到的第一条输出语句,就是: System.out.println("Hello World"); 毫无疑问,该语句的作用就是将He ...

  4. c语言中用于格式化输出的函数,C语言中格式化输入输出函数(转)

    1.1.1 格式化输入输出函数 一.printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息.在编写程序时经常会用到此函数.printf()函数的调用格 ...

  5. c语言中输入格式带括号,C语言中printf()后的括号里面的怎么写,表示什么?...

    int printf(const char *format,[argument]); format 参数输出的格式,定义格式为: %[flags][width][.perc] [F|N|h|l]typ ...

  6. C语言中不同格式化输出的含义(%e、%g、%u、%hd)等

    %d:整型输出,%ld长整型输出 %o:以八进制数形式输出整数,打印的是无符号类型 %x:以十六进制数形式输出整数,%X以大写字母输出,打印的是无符号类型 %u:以十进制数输出unsigned型数据( ...

  7. c语言printf啥意思,printf在c语言中的意思是什么呢

    在C语言中printf( )是专门用于输出的2113语句.5261 用法如下:1.printf()函数是格式化输出4102函数,一般用于向标准输出设备按1653规定格式输出信息.2.printf()函 ...

  8. C语言中几个字符串输出

    printf 功能 c语言中产生格式化输出的函数(定义在 stdio.h 中).向终端输出(显示器等) 用法 int printf(const char *format,[argument]); fo ...

  9. C语言中的%f和%lf的区别

    在C语言中用于格式化输入输出时: 整数值用%d; 实数(浮点数)用%f: float,单精度浮点型,对应%f. double,双精度浮点型,对应%lf. 即 %f 和 %lf分别对应float类型和d ...

最新文章

  1. myeclipse 遇到的一些问题及解决方案
  2. 【Python】如何在文件夹里批量修改文件名?(0001-1000)
  3. 阿里巴巴Java开发手册终极版
  4. Java_io体系之CharArrayReader、CharArrayWriter简介、走进源码及示例——13
  5. 使用Boxfuse为您的REST API设置https
  6. 同步应用(python 版)
  7. LeetCode 674 最长连续递增子序列
  8. MacOS如何设置多任务桌面
  9. 《深入浅出统计学》读书笔记
  10. 部分大学上演造假运动闯关本科评估(图)
  11. 分布式与微服务☞web组件kafka
  12. ros_多消息同步回调(Synchronizer)
  13. 【JavaSe】异常
  14. 微信小程序前端解密获取用户信息
  15. 数据结构(一):数据结构的概述
  16. 1.第三章 选择结构(一)
  17. 2口kvm切换器使用方法简述
  18. optimizer.step()代表什么意思
  19. 如何用“底层逻辑“看透世界的底牌?| 刘润最新演讲-学习总结
  20. 免费下载excel办公软件_Smartbi电子表格下载

热门文章

  1. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法
  2. mac php oracle11g,Oracle11G函数整理
  3. 开源GIS解决方案,暨GeoServer+OpenLayer结合开发总结
  4. 网页中如何使用一些特殊字体
  5. VRP网络操作系统简介
  6. 关于gcc、glibc和binutils模块之间的关系
  7. Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析
  8. 如何在网页标题栏title加入logo(icon)图标?
  9. yum install nginx
  10. 设置Clover默认进入Windows,按快捷键F8可选择不同的引导