在C中打印结构字段和值

use*_*115 15 c printf structure

我有兴趣打印结构字段.

Typedef struct
{
   UINT32 thread_id;
   BOOL   is_valid;
}T_THREAD;
Run Code Online (Sandbox Code Playgroud)

是否有一种方法用"C"语言来打印结构的内容,如

ex:print (T_THREAD)和输出应该是这样的

Contents of a structure T_THREAD are 
  thread_id
  is_valid
Run Code Online (Sandbox Code Playgroud)

San*_*war 14

你要找的是反思.Java和其他虚拟语言具有反射,因此您可以打印出任何给定类的变量名称和函数名称.因为编译器会自动构建这些反射函数.

C没有反射.你必须手动完成所有事情.


Sou*_*osh 5

不,没有实现您想要的标准/预定义方式。

是的,但是,您可以编写自己的函数,该函数具有要打印的特定结构元素值的知识,然后,使用结构变量的特定实例对函数进行一次调用,就可以获取的所有值。所有成员都被打印出来。就像是

T_THREAD var;

my_print(var);  //my_print() is the function you'll roll out
Run Code Online (Sandbox Code Playgroud)

应该能够打印这些值。

但是,请注意,这不会允许您打印变量名称的任何方式,只有“值”。


Haw*_*awk 5

至于您的结构,该函数将如下所示。

// st_name is the name of the struct
void print(T_THREAD *st, const char *st_name)
{
    printf("Contents of structure %s are %lu, %d\n", st_name, st->thread_id, st->is_valid);
}
Run Code Online (Sandbox Code Playgroud)

  • 当我们不知道结构的元素时,我们该如何打印呢? (2认同)

Roa*_*ner 5

您无法使用一条printf语句打印所有结构元素。在 C 语言中,您必须手动将它们全部打印出来。下面是创建两个结构成员并将它们打印出来的示例:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct {
    char *name;
    int thread_id;
    bool is_valid;
}T_THREAD;

int
main(void) {
    T_THREAD T1 = {"T1", 123, 1};
    T_THREAD T2 = {"T2", 456, 0};

    printf("\nContents of a structure %s are:\n", T1.name);
    printf("thread_id: %d\n",T1.thread_id);
    printf("is_valid: %d\n", T1.is_valid);

    printf("\nContents of a structure %s are:\n", T2.name);
    printf("thread_id: %d\n",T2.thread_id);
    printf("is_valid: %d\n", T2.is_valid);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Contents of a structure T1 are:
thread_id: 123
is_valid: 1

Contents of a structure T2 are:
thread_id: 456
is_valid: 0
Run Code Online (Sandbox Code Playgroud)

或者,您也可以创建一个函数来执行此操作:

int
main(void) {
    T_THREAD T1 = {"T1", 123, 1};
    T_THREAD T2 = {"T2", 456, 0};

    print_struct_elements(&T1);
    print_struct_elements(&T2);

    return 0;
}

void
print_struct_elements(T_THREAD *T) {
    printf("\nContents of a structure %s are:\n", T->name);
    printf("thread_id: %d\n",T->thread_id);
    printf("is_valid: %d\n", T->is_valid);
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,您可以在一次调用 printf 中打印所有内容:`printf("\n结构 %s 的内容是:\nthread_id: %d\nis_valid: %d\n", T-&gt;name, T-&gt;thread_id, T -&gt;is_valid);` (3认同)