前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编程这么久, printf 知多少(二)

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

作者头像
用户5908113
发布2020-11-09 11:44:58
7120
发布2020-11-09 11:44:58
举报
文章被收录于专栏:Pou光明Pou光明

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

一、设置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: 白色

例子:

代码语言:javascript
复制
    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、 #预编译时将参数转换为字符串

即加上””

示例:

代码语言:javascript
复制
#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;
}

程序结果:

代码语言:javascript
复制
dh@ubuntu:~/workSpace/Linux/printf$ gcc printf.c 
dh@ubuntu:~/workSpace/Linux/printf$ ./a.out 
test1:1
test2:2
test1 + test2:3

2、##连接运算符

预编译时拼接两个符号。

示例:

代码语言:javascript
复制
#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);

程序结果:

代码语言:javascript
复制
num = 1234 
num = 34

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

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

VC编译器不会有问题

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

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

只有gcc编译器支持。

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

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

代码语言:javascript
复制
#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);      // 正确打印

程序结果:

代码语言:javascript
复制
i=0,j=1
new hello world 
i=0,j=1

四、总结

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

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

代码语言:javascript
复制
#define DEBUG(fmt, ...) printf("\033[31m[TEST: %s:%d:%s:%s] "#fmt"\033[0m\r\n", __func__, __LINE__, __DATE__, __TIME__, ##__VA_ARGS__)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Pou光明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档