在 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
.
的成员变量类型
您需要滚动自己的函数来实现您想要的任务。
没有。最好的解决方案是编写如下方法:
void printABC(struct ABC*)
或
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。
在 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
.
您需要滚动自己的函数来实现您想要的任务。
没有。最好的解决方案是编写如下方法:
void printABC(struct ABC*)
或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。