【C语言】双引号中使用宏定义

发布时间 2023-08-02 09:08:42作者: 墨尔基阿德斯

 

 


快速答案

使用星号占位符(*)

printf("%*d", -4, "12"); // 或 printf("%-*d", 4, "12");
// 得到的输出:"12  " (12后面有两个空格)

 

详细讲解

举个例子

通常,我们为了保证输出格式美观,会使用下面的方式输出

#include <stdio.h>

#define MAX_STR_NUM 3
#define MAX_STR_LEN 7

int main() {
    char s[MAX_STR_NUM][MAX_STR_LEN] = {"Vi", "Jinx", "Yasuo"};
    
    printf("Cham1   Cham2   Cham3\n");
    printf("%-7s %-7s %-7s\n", s[0], s[1], s[2]);
    
    return 0;
}

// 得到的输出:
// Cham1   Cham2   Cham3
// Vi      Jinx    Yasuo

 

但是,当我们需要使用更长的字符串时,在修改了MAX_STR_LEN之后,还需要手动将printf里,%-7s7分别修改。

这就丧失了代码的一致性 (Consistency)

那么,能不能在双引号里使用宏定义常量,来指定格式化后字符串的长度呢?

方法 及 代码

这里,我们使用C语言的星号(*)占位符

printf("%*s", 3, "ab"); // printf("%*s", 宽度, 变量值);
// 得到的输出:"ab "

printf("%*d", -4, "12"); // 或 printf("%-*d", 4, "12");
// 得到的输出:"12  " (12后面有两个空格)

 

首先,我们将列的标题也放进字符串数组中,然后和数据一起使用星号占位符格式化输出。

这是改进后的代码

#include <stdio.h>

#define MAX_STR_NUM 3
#define MAX_STR_LEN 7

int main() {
    char s[MAX_STR_NUM][MAX_STR_LEN] = {"Vi", "Jinx", "Yasuo"};
    char headline[MAX_STR_NUM][MAX_STR_LEN] = {"Cham1", "Cham2", "Cham3"};
    
    printf("%-*s %-*s %-*s\n", MAX_STR_LEN, headline[0], MAX_STR_LEN,
           headline[1], MAX_STR_LEN, headline[2]);
    printf("%-*s %-*s %-*s\n", MAX_STR_LEN, s[0], MAX_STR_LEN, s[1],
           MAX_STR_LEN, s[2]);
           
    return 0;
}

// 得到的输出:
// Cham1   Cham2   Cham3
// Vi      Jinx    Yasuo

 

这时,只用改变MAX_STR_LEN的值,就能得到整齐的输出了。

#define MAX_STR_LEN 7
// 得到的输出:
// Cham1   Cham2   Cham3
// Vi      Jinx    Yasuo

#define MAX_STR_LEN 10
// 得到的输出:
// Cham1      Cham2      Cham3
// Vi         Jinx       Yasuo

 

参考资料

C语言 宏定义 如何插入到 printf中的双引号里面去?- 百度知道

c语言中的星号(*)占位符