c - 使用 sprintf 和 #define 常量在 C 中填充字符串

标签 c gcc printf clang

假设我有一个定义整数的 #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 Number)”。 C 中是否有以这种方式使用 #define 指令的习惯用法,或者我是否需要编写一个自定义函数来使用仅在运行时已知的填充宽度进行零填充?

最佳答案

试试这个:

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

我对 int 进行了强制转换,因为 * 宽度/精度特殊项始终需要 int,如果参数发生,可能会发生不好的事情具有不同的整数类型。在您的情况 (20) 中,您不需要它,但它不会造成伤害。

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

关于c - 使用 sprintf 和 #define 常量在 C 中填充字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30281973/

相关文章:

c - 关于gcc编译的x86_64代码和C代码优化

c - 如何仅打印字符串的第一部分

在 C 中读取和打印 .txt 文件行的最清晰方法

c - 使用 printf 填充包含变量的字符 block

将多字符数组复制到另一个多字符数组

c - C 中的结构体赋值

c - C 中字符串的指针

c++ - 在 shell 中为 make 设置 GCC 版本

c - 强制 C 程序在内核模式下运行一段时间

c++ - glibc 函数的 GCC、-flto、-fno-builtin 和自定义函数实现