C中的变量格式说明符
我有一个printf语句如下:
printf("[%d] %d", i, n->data);
我试图使相关代码更加灵活,以便根据需要更改“n-> data”的变量类型。 有没有办法让格式说明符更新取决于使用的变量类型?
我试过包括:
const char FS[2] = "%f";
当变量是一个float时,然后修改printf语句来:
printf("[%d] "FS, i, n->data);
但是这会得到以下错误,我不知道如何解决:
dLList.c:125:23: error: expected ')'
printf("[%d] "FS, i, n->data);
^
dLList.c:125:15: note: to match this '('
printf("[%d] "FS, i, n->data);
^
1 error generated.
有任何想法吗? 谢谢
而不是const char FS[2] = "%f";
,你可以尝试像这样使用宏:
#define FS "%f"
这会聚集控制字符串格式,因为你显然想要的。
有没有办法让格式说明符更新取决于使用的变量类型?
是的,C11有_Generic
。 这允许根据表达式的类型选择代码。 选择不在运行时进行评估,但在编译时确定类型。
#include <stdio.h>
#include <stdlib.h>
#define print(X) printf(_Generic((X),
double: "%en",
int: "%in",
char *: "%sn",
default: "TBD"
) , X)
int main(void) {
print(5.0);
print(5);
print("Five");
print(1.0f);
return 0;
}
产量
5.000000e+00
5
Five
TBD
您可以使用枚举和查找表格格式化字符串。 只要确保包含数据的结构也包含一个匹配的枚举,该枚举描述了当前包含在结构中的数据的类型。
这样你就可以编写一个打印函数来接受这样一个结构作为参数,并使用正确的格式字符串打印它的值。
#include <stdio.h>
typedef enum Format_
{
/* Add/remove formats as needed. */
SIGNED_DECIMAL_INT,
UNSIGNED_DECIMAL_INT,
DECIMAL_FLOATING_POINT,
STRING,
POINTER_ADDRESS,
NUM_SUPPORTED_FORMATS
} Format;
static const char* formatStrings[NUM_SUPPORTED_FORMATS] =
{
"%dn", /* Add more complex format strings if needed. */
"%un",
"%fn",
"%sn",
"%pn"
};
typedef struct Wrapper_
{
Format format;
float data;
} Wrapper;
void printData(const Wrapper *const wrapper)
{
printf(formatStrings[wrapper->format], wrapper->data);
}
int main(void)
{
Wrapper wrapper;
wrapper.format = DECIMAL_FLOATING_POINT;
wrapper.data = 12.345f;
/* Prints 12.345000 */
printData(&wrapper);
return 0;
}
链接地址: http://www.djcxy.com/p/90303.html