gpt4 book ai didi

c++ - 函数指针中的参数列表

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:21 25 4
gpt4 key购买 nike

我可以在我的函数中打印 2 个以上的参数 ptr * Os_printf * 但我的函数只适用于 1 个参数。

例如-->

Os_printf("Moon %d %d",55,5);

输出:

Moon 55 5

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

char db[50];

void test_1(int (*debug)())
{
debug("JOY %d %d \n",4,55);
}

volatile int (*ptr_fscreener)(char * __restrict, const char * __restrict, ...);

void Os_formater(int (*debug)() )
{
ptr_fscreener=debug;
}

void Os_printf(const char * __restrict out,void**d)
{
va_list args;
char db[50];
ptr_fscreener(db,out,d);
puts(db);
}

int main(void) {
Os_formater(sprintf);
Os_printf("Moon %d",55);
test_1(printf);
puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
return EXIT_SUCCESS;
}


/******* OUTPUT For example ******/
Moon 55
JOY 4 55
!!!Hello World!!!

最佳答案

您需要使用 <stdarg.h>可能是vsnprintf() , 在许多其他变化中:

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

void test_1(int (*debug)(const char *format, ...))
{
debug("JOY %d %d\n",4,55);
}

static int (*ptr_fscreener)(char *, size_t, const char *, va_list);

void Os_formatter(int (*debug)(char *buffer, size_t buflen, const char *format, va_list args))
{
ptr_fscreener = debug;
}

void Os_printf(const char *out, ...)
{
va_list args;
char db[50];
va_start(args, out);
ptr_fscreener(db, sizeof(db), out, args);
va_end(args);
puts(db);
}

int main(void)
{
Os_formatter(vsnprintf);
Os_printf("Moon %d",55);
test_1(printf);
puts("!!!Hello World!!!");
return EXIT_SUCCESS;
}

使用 vsnprintf()只要您正确使用它,就可以为您提供一些防止缓冲区溢出的保护。恢复使用 vsnprintf() 相当简单;无法使用 snprintf()sprintf()我认为可靠。

编译:

gcc -O3 -g -std=c99 -Wall -Wextra va.c -o va  

结果:

Moon 55
JOY 4 55
!!!Hello World!!!

关于c++ - 函数指针中的参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10289572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com