3

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

#define MACR 6

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

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

4

4 回答 4

10

使用*格式说明符将宽度作为参数传递。像这样的东西应该工作:

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

但请使用常量而不是 MACRO。

于 2013-03-19T15:06:46.077 回答
2

最简单的解决方案是用 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。)

于 2013-03-19T15:08:12.820 回答
1

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

  1. 在宏中有完整的格式:

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

    #define MACR 6
    
    sprintf(Formatted, "%0*d", MACR, Number);
    
于 2013-03-19T15:08:13.980 回答
0
#define MAKE_TEXT(x) #x
sprintf( Formatted, "%0"MAKE_TEXT(MACR)"d", Number );
于 2013-03-19T15:07:29.283 回答