专栏首页Pou光明编程这么久, printf 知多少(二)

编程这么久, printf 知多少(二)

接着上篇文章,把剩下的参数理一理。

一、设置printf输出字体颜色

格式:

printf(“\033[字体背景颜色;字体颜色m字符串\033[0m”);

把\033换成\e是一样的,为了使程序更有可读性,可以定义为宏

字背景颜色范围: 40--49 字颜色: 30--39

40: 黑 30: 黑

41: 红 31: 红

42: 绿 32: 绿

43: 黄 33: 黄

44: 蓝 34: 蓝

45: 紫 35: 紫

46: 深绿 36: 深绿

47: 白色 37: 白色

例子:

    char cTest[] = "hello";

    printf("\033[45;36m[hello world]\n\033[0m");
    printf("\033[32m[hello world]\n\033[0m");
    printf("\033[32m[%s]\n\033[0m",cTest);

运行结果:

其他属性汇总:

\033[0m 关闭所有属性

\033[1m 设置高亮度

\03[4m 下划线

\033[5m 闪烁

\033[7m 反显

\033[8m 消隐

\033[30m -- \033[37m 设置前景色

\033[40m -- \033[47m 设置背景色

\033[nA 光标上移n行

\03[nB 光标下移n行

\033[nC 光标右移n行

\033[nD 光标左移n行

\033[y;xH设置光标位置

\033[2J 清屏

\033[K 清除从光标到行尾的内容

\033[s 保存光标位置

\033[u 恢复光标位置

\033[?25l 隐藏光标

\33[?25h 显示光标

二、#和##运算符

1、 #预编译时将参数转换为字符串

即加上””

示例:

#define CONVERT(TEST) printf("%s:%d\n", #TEST, TEST);

int main()
{
    int test1 = 1, test2 = 2;

    CONVERT(test1);
    CONVERT(test2);
    CONVERT(test1 + test2);

    return 0;
}

程序结果:

dh@ubuntu:~/workSpace/Linux/printf$ gcc printf.c 
dh@ubuntu:~/workSpace/Linux/printf$ ./a.out 
test1:1
test2:2
test1 + test2:3

2、##连接运算符

预编译时拼接两个符号。

示例:

#define SPLICE(PARAM1, PARAM2) (PARAM1##PARAM2)

    int num = SPLICE(12, 34);
    printf("num = %d \n", num);

    int num1 = SPLICE(,34);
    printf("num = %d \n", num1);

程序结果:

num = 1234 
num = 34

如果连接两个字符串,会有下面的错误。

gcc 编译器会遇到的error :does not give a valid preprocessing token

VC编译器不会有问题

感兴趣的朋友可以深入了解一下,这是不同编译器对同一问题产生的看法不同导致的。

三、__VA_ARGS__ 可变参数的宏(C99)

只有gcc编译器支持。

宏参数列表最后一个参数为省略号(三个点)

直接用例子感受下吧,就像做数学题一样。。。

#define MYPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
#define MYNEWPRINTF(fmt, ...) printf(fmt, ##__VA_ARGS__)

    int i = 0;
    int j = 1;
    MYPRINTF("i=%d,j=%d\n",i,j);          // 正确打印

    MYNEWPRINTF("new hello world \n") ;       // 编译正确
    MYNEWPRINTF("i=%d,j=%d\n",i,j);      // 正确打印

程序结果:

i=0,j=1
new hello world 
i=0,j=1

四、总结

本来想弄明白printf后面各参数的含义,结果.....

最后,昨天的日志输出也可以写成下面的形式:

#define DEBUG(fmt, ...) printf("\033[31m[TEST: %s:%d:%s:%s] "#fmt"\033[0m\r\n", __func__, __LINE__, __DATE__, __TIME__, ##__VA_ARGS__)

本文分享自微信公众号 - Pou光明(pou0230),作者:PouG

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【编程基础】c printf知多少

    printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是用%c 符号.这些符号被称为...

    程序员互动联盟
  • 编程这么久, 它们了解多少(一)

    对于日志,一般情况下可以设置日志输出等级、输出到终端或文件、输出到每个文件的大小、日志被覆盖的策略,还有的可以在程序运行过程中更改日志的等级,或者将日志输出到远...

    用户5908113
  • 用了这么久的python,这些零碎的基础知识,你还记得多少?

    ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'cla...

    一墨编程学习
  • 萌新学习C++容易漏掉的知识点看看你中招了没有(二)

           很多人,包括我,看书,看完一章怎么怎么的,然后不管是作业,还是考试出现这一章的内容,总有些地方跟我们脑袋里面理解的不一样,自己明明学习过,但机器给...

    花狗Fdog
  • 同事用#include"xxx.c"把我给惊呆了!!

    歌名虽然是<男孩>却是一首来自男人内心深处的歌,千万不要在太安静的环境中听,容易伤感!

    C语言与CPP编程
  • 音频和视频流最佳选择?SRT 协议解析及报文识别

    我们所知道 SRT 是由 Haivision 和 Wowza 开发的开源视频流协议。很多人会认为在不久的将来,它被是 RTMP 的替代品。因为 RTMP 协议安...

    玖柒的小窝
  • 【典藏】大佬们都在用的结构体进阶小技巧

    今天跟大家分享一首华晨宇的《我管你》,个人觉得这首歌表达了一种年轻人的热血感,每次听都让自己非常来劲。最近工作挺忙的,写文章或许已经成为了一种兴趣和爱好...

    C语言与CPP编程
  • 一个 printf 引发的基础复习

    初看时,想当然了一下觉得输出就是1 1.00,后来编译出来运行一下,屏幕上却赫然是-1717986918 1.60。

    mzlogin
  • 一个printf(结构体指针)引发的血案

    在上周六,我在公众号里发了一篇文章:C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻,以直白的语言、一目了然的图片来解释指针的底层逻辑,有一位小伙伴对...

    IOT物联网小镇
  • 一个printf(结构体指针)引发的血案

    在上周六,我在公众号里发了一篇文章:C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻,以直白的语言、一目了然的图片来解释指针的底层逻辑,有一位小伙伴对...

    GorgonMeducer 傻孩子
  • 古典密码-凯撒密码原理以及代码

    相传在很久很久以前,有一位皇帝,叫做 尤利乌斯 · 凯撒 为了缩短名字,我们称为凯撒大帝.是在公元前100年左右单身与古罗马,是一名著名的军事统帅.由它发明的...

    IBinary
  • 一个简单的C语言测试框架

    工作久了,难免有一些知识点容易遗忘,每次遗忘都会去重新写一个测试demo,然后测试出结果后就把这个demo给删掉了,下次又忘了,又要重写去写,这真是一件吃力不讨...

    小林C语言
  • 【计算机本科补全计划】C++牛客网试题习题解析

    正文之前 一大早醒来,外面淅淅沥沥的雨绵绵的下着,床铺真的舒服,但是我也不能就在床上刷微博看小说吧,所以想起了昨晚下载的牛客网的APP,赶紧掏出我的大宝贝---...

    用户1687088
  • 配合格式化字符串漏洞绕过canary保护机制

    我们知道,缓冲区溢出漏洞利用的关键处就是溢出时,覆盖栈上保存的函数返回地址来达到攻击效果。于是就有人就设计出了很多保护机制:Canary、PIE、NX等。本文讨...

    FB客服
  • Linux内核宏container_of的深度剖析

    我在好几年前读linux 驱动代码的时候看到这个宏,百度了好久,知道怎么用了,但是对实现过程和原理还是一知半解。

    砸漏
  • C语言——小学四年级题目解析(一)

    不过今天的题目有点升级,直接跳到了四年级,其实难度上都属于入门,只不过是题型变了。

    Ed_Frey
  • 一个简单的C语言测试框架

    工作久了,难免有一些知识点容易遗忘,每次遗忘都会去重新写一个测试demo,然后测试出结果后就把这个demo给删掉了,下次又忘了,又要重写去写,这真是一件吃力不讨...

    小林C语言
  • 你见过“最美”的C语言代码是什么?

    我们都知道雷军雷布斯说过当时他写的代码像诗一样优美,那已经是三十年前的汇编时代了,那么现在你有见到过最美的c语言代码吗?

    李肖遥
  • 来看一道"简单的"C语言面试题

    貌似很久没有更新文章了,前两天更新了一篇《想后台运行没想到导致磁盘满了》,里面涉及的内容比较广,可惜看的人不多。今天来看到小题,复习一下。

    编程珠玑

扫码关注云+社区

领取腾讯云代金券