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

2020-11-09 11:44:58 浏览数 (1)

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

一、设置printf输出字体颜色

格式:

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

把33换成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("33[45;36m[hello world]n33[0m");
    printf("33[32m[hello world]n33[0m");
    printf("33[32m[%s]n33[0m",cTest);

运行结果:

其他属性汇总:

33[0m 关闭所有属性

33[1m 设置高亮度

3[4m 下划线

33[5m 闪烁

33[7m 反显

33[8m 消隐

33[30m -- 33[37m 设置前景色

33[40m -- 33[47m 设置背景色

33[nA 光标上移n行

3[nB 光标下移n行

33[nC 光标右移n行

33[nD 光标左移n行

33[y;xH设置光标位置

33[2J 清屏

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

33[s 保存光标位置

33[u 恢复光标位置

33[?25l 隐藏光标

33[?25h 显示光标

二、#和##运算符

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

即加上””

示例:

代码语言:javascript复制
#define CONVERT(TEST) printf("%s:%dn", #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=%dn",i,j);          // 正确打印

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

程序结果:

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

四、总结

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

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

代码语言:javascript复制
#define DEBUG(fmt, ...) printf("33[31m[TEST: %s:%d:%s:%s] "#fmt"33[0mrn", __func__, __LINE__, __DATE__, __TIME__, ##__VA_ARGS__)

0 人点赞