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

上一篇: Variable format specifier in C

下一篇: Different rounding between assignment and printf