【问题标题】:argument list in Function pointer函数指针中的参数列表
【发布时间】:2012-04-23 23:14:40
【问题描述】:

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

例如 -->

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

输出:

月亮 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!!!

【问题讨论】:

标签: c++ c pointers gcc posix


【解决方案1】:

您需要使用&lt;stdarg.h&gt; 可能还有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!!!

【讨论】:

  • 您定义了两次char db[50]; - 您需要之前的定义吗?在您满意地解决这一点后,我会支持您的回答。
  • @Blaisorblade:不需要全局变量db;它未使用。我只是忘了删除它。我唯一的借口是它在原版中(这不是什么借口)并且没有造成任何伤害(这也不是一个好的借口,但准确)。
猜你喜欢
  • 2011-11-12
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多