使用sprintf和#define常量填充C中的字符串

时间:2015-05-17 00:04:40

标签: c gcc printf clang

假设我有一个定义整数的#define指令:

#define ZEROPADDING 20

有没有办法使用sprintf()的常量来填充字符串?

目前我这样做,其中包含一个“幻数”:

size_t my_string_length = 0;
/* append some stuff to my string... */
/* append string length to my string, for example */
my_string_length += sprintf(my_string + my_string_length, "%020zu", strlen(my_string));

我想用以下内容替换它:

my_string_length += sprintf(my_string + my_string_length, "%0ZEROPADDINGzu", strlen(my_string));

或者:

my_string_length += sprintf(my_string + my_string_length, "%0"ZEROPADDING"zu", strlen(my_string));

但编译器说我不能这样做。

我想避免使用“魔术数字”。 C中是否有以这种方式使用#define指令的习惯用法,或者我是否需要使用仅在运行时知道的填充宽度将自定义函数编写到零填充?

2 个答案:

答案 0 :(得分:2)

试试这个:

my_string_length += sprintf(my_string + my_string_length, "%0*zu",
    (int)ZEROPADDING, strlen(my_string));

我使用强制转换为int,因为*宽度/精度特殊总是需要int,如果参数碰巧有不同的整数类型,则可能会发生错误。在你的情况下(20)你不需要它,但它并没有受到伤害。

顺便说一句,你不应该使用sprintf;请改用snprintf

答案 1 :(得分:1)

最后一个是最接近的。如果添加像

这样的宏
#define QUOTED(n) #n

并使用

my_string_length += sprintf(my_string + my_string_length,"%0" QUOTED(ZEROPADDING) "zu", strlen(my_string));

宏引用其参数(使用#运算符),使其成为字符串。

相关问题