在 C 中使用单行打印结构?

Printing the structure using a single line in C?

在 C 语言中是否有任何可能的方法(通过使用任何函数或任何此类函数),以便我们可以使用一行打印不同数据类型的结构中的内容? 例如说:

typedef struct ABC{
   int a;
   char b;
   long c;
}ABC1;

要打印这个我们需要写: printf("%d %s %ld",ABC1.a,ABC1.b,ABC1.c)

任何其他方法,以便我可以像这样打印 printf("????",????ABC1)??

首先,代码可能无法编译。您已将 ABC1 定义为 ABC 结构的 typedef。 ABC1不是变量,所以无法查看ABC1.a.

的内容

假设您创建了一个类型为 ABC1 的变量,您不能使用 printf "dump" "logical" 格式的结构内容。 printf 函数接收内存地址并根据给定的字符串显示其内容。如果 printf 函数只有一个指向内存的指针(即一堆字节,无法知道 "type" 个字节),则它无法知道结构的格式。

不,printf() 只支持预定义数据类型的格式说明符,不支持用户定义的数据类型 (struct)。而且,printf()也没有办法自动学习你的struct.

的成员变量类型

您需要滚动自己的函数来实现您想要的任务。

没有。最好的解决方案是编写如下方法:

  1. void printABC(struct ABC*)
  2. char* abcToString(struct ABC*)(然后通过 %s 打印)。

选项 2 可能更好,可用于写入文件等。

就像@john3136 说的。

但这是 1 的示例。

void printABC(ABC1 *ABC) /* can also use 'struct ABC*' */
{
   printf("%d %c %ld",ABC->a,ABC->b,ABC->c);
   /* Equivalent to the below */
   /* printf("%d %s %ld",(*ABC).a,(*ABC).b,(*ABC).c); */
}

所以现在每次你想要打印整个东西时,你只需输入类似

的内容
    ABC1 xyz;

    /* fill xyz here*/

    printABC(&xyz);

并且它应该在一行中输入 ABC1 内的所有内容。

如果您使用的是比较现代的 C 编译器,则可以使用泛型宏:

#include <stdio.h>

typedef struct {
   int a;
   char b;
   long c;
} ABC;

// printf conversion specifiers:
#define CS(x)   \
  _Generic((x), \
    int:  "%d", \
    char: "%c", \
    long: "%ld")


int main (void)
{
  ABC abc = {1, 'a', 2};

  printf(CS(abc.a), abc.a); printf(" ");
  printf(CS(abc.b), abc.b); printf(" ");
  printf(CS(abc.c), abc.c); printf(" ");

  return 0;
}

Glibc 允许您为 printf 和系列建立您自己的格式说明符,以便您通过一些扩展打印 UDT,否则这是不可能的。

#include <stdio.h>
#include <printf.h> /* For PA_POINTER */

struct MyStruct
{
    int a;
    double b;
};

struct print_info;
int handler(FILE *stream, const struct print_info *i, 
        const void* const *args)
{
    const struct MyStruct *ptr = *( (const struct MyStruct**) (*args) );
    int rc = fprintf(stream, "a: %d, b: %f\n", ptr->a, ptr->b);

    return rc;
}

int print_arginfo (const struct printf_info *info, size_t n,
                      int *argtypes)
{
  if (n > 0)
    argtypes[0] = PA_POINTER;
  return 1;
}

int main(void)
{
    struct MyStruct s = {55, -3.14};
    /* We're gonna use the M specifier */
    int spec = 'M';
    int rc = register_printf_function(spec, handler, print_arginfo);

    if (rc != 0)
        return 1;

    printf("%M", &s);

};

您可能会找到文档 here