Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用宏填充C中的数字?_C - Fatal编程技术网

如何使用宏填充C中的数字?

如何使用宏填充C中的数字?,c,C,我试图在sprintf语句中使用宏。是这样的: #define MACR 6 .... int Number= 5; char Formatted[30]; sprintf( Formatted, "%06d", Number ); 在这里,我想使用MACR而不是6。有人能帮我吗?使用*格式说明符将宽度作为参数传递。像这样的方法应该会奏效: sprintf( Formatted, "%0*d", MACR, Number ); 但请使用常量而不是宏 最简单的解决方案就是用 #define

我试图在sprintf语句中使用宏。是这样的:

#define MACR 6

....
int Number= 5;
char Formatted[30];
sprintf( Formatted, "%06d", Number );

在这里,我想使用MACR而不是6。有人能帮我吗?

使用
*
格式说明符将宽度作为参数传递。像这样的方法应该会奏效:

sprintf( Formatted, "%0*d", MACR, Number );

但请使用常量而不是宏

最简单的解决方案就是用
#define MAKE_TEXT(x) #x
sprintf( Formatted, "%0"MAKE_TEXT(MACR)"d", Number );
a
“*”
,并将宏作为参数传递:

sprintf( formatted, "%0*d", MACR, number );
或者,您可以连接字符串,例如:

sprintf( formatted, "%0" STRINGIZE(MACR) "d", number );
使用常用的STRINGIZE宏:

#define STRINGIZE_HELPER(x) # x
#define STIRNGIZE(x) STRINGIZE_HELPER(x)

(当然,最简单、最安全的解决方案就是忘记
sprintf
,使用
std::ostringstream

有两种方法可以解决这个问题:

  • 在宏中具有完整的格式:

    #define MACR  "%06d"
    
    sprintf(Formatted, MACR, Number);
    
  • 使用
    *
    宽度说明符:

    #define MACR 6
    
    sprintf(Formatted, "%0*d", MACR, Number);
    

  • 如果我想在运行时将其更改为用户确定的内容,会发生什么情况?虽然您可以这样做,
    *
    符号是一个更好的选择。@RichardJ.RossIII如何在运行时更改宏?@neagogegab我指的是根据用户输入更改填充,或者一些我可能不想成为宏的东西。@JonathanLeffler,是的,你可以这样做,但问题是关于使用宏。你丢失了原始格式的
    0
    ,没有使用
    ,这意味着
    0
    是不必要的。