使用 sprintf 和 #define 常量在 C 中填充字符串
Padding string in C with sprintf and #define constant
假设我有一个定义整数的 #define
指令:
#define ZEROPADDING 20
有没有办法将该常量与 sprintf()
一起使用来对字符串进行零填充?
目前我是这样做的,其中包含一个"magic number":
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));
但是编译器说我不能这样做。
我想避免使用 "magic numbers"。 C 中是否有以这种方式使用 #define
指令的习惯用法,或者我是否需要编写一个自定义函数来使用仅在运行时已知的填充宽度进行零填充?
最后一个最接近。如果你添加一个像
这样的宏
#define QUOTED(n) #n
并使用它
my_string_length += sprintf(my_string + my_string_length,"%0" QUOTED(ZEROPADDING) "zu", strlen(my_string));
宏引用其参数(使用 #
运算符),使其成为字符串。
试试这个:
my_string_length += sprintf(my_string + my_string_length, "%0*zu",
(int)ZEROPADDING, strlen(my_string));
我使用了对 int
的转换,因为 *
width/precision 特殊总是需要 int
,如果参数碰巧有不同的整数,可能会发生不好的事情类型。在你的情况下 (20) 你不需要它,但它不会造成伤害。
顺便说一句,你不应该使用 sprintf
;请改用 snprintf
。
假设我有一个定义整数的 #define
指令:
#define ZEROPADDING 20
有没有办法将该常量与 sprintf()
一起使用来对字符串进行零填充?
目前我是这样做的,其中包含一个"magic number":
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));
但是编译器说我不能这样做。
我想避免使用 "magic numbers"。 C 中是否有以这种方式使用 #define
指令的习惯用法,或者我是否需要编写一个自定义函数来使用仅在运行时已知的填充宽度进行零填充?
最后一个最接近。如果你添加一个像
这样的宏#define QUOTED(n) #n
并使用它
my_string_length += sprintf(my_string + my_string_length,"%0" QUOTED(ZEROPADDING) "zu", strlen(my_string));
宏引用其参数(使用 #
运算符),使其成为字符串。
试试这个:
my_string_length += sprintf(my_string + my_string_length, "%0*zu",
(int)ZEROPADDING, strlen(my_string));
我使用了对 int
的转换,因为 *
width/precision 特殊总是需要 int
,如果参数碰巧有不同的整数,可能会发生不好的事情类型。在你的情况下 (20) 你不需要它,但它不会造成伤害。
顺便说一句,你不应该使用 sprintf
;请改用 snprintf
。