【问题标题】:Variable arguments is not printing变量参数不打印
【发布时间】:2018-12-03 20:24:32
【问题描述】:
#define TRACE2(args)   TraceDebug args;

void TraceDebug ( const char * format, ... );

void TraceDebug ( const char * format, ... )
{
  static char buffer[256];
  va_list args;
  va_start (args, format);
  vsprintf (buffer,format, args);
  va_end (args);
}


int main(void)
{
    TRACE2(("ece %d is of %d students.", 1,33));
    return 0;    
}

预期的输出是ece 1 is of 33 students. 为什么输出屏幕是空白的?

【问题讨论】:

  • 你填充了缓冲区,但你没有对它做任何事情,也许只是一个 printf("%s\n", buffer);不见了?
  • 旁注:你应该更喜欢vsnprintf 而不是vsprintf 以避免意外的缓冲区溢出,尤其是因为调用者看不到缓冲区大小。
  • 你的宏没什么意义,你可以像TraceDebug("ece %d is of %d students.", 1, 33)一样直接调用你的函数
  • @ChrisTurner 这种技术可以更轻松地通过切换单个定义来启用或禁用调试

标签: c printf variadic-functions


【解决方案1】:

您只打印到buffer,但不会在屏幕上打印任何内容。

这是你需要的:

void TraceDebug ( const char * format, ... )
{
  static char buffer[256];
  va_list args;
  va_start (args, format);
  vsprintf (buffer,format, args);
  va_end (args);
  printf("%s", buffer);  // <<< add this
}

如果您只想在屏幕上输出,或者只使用vprintf

void TraceDebug(const char * format, ...)
{
  va_list args;
  va_start(args, format);
  vprintf(format, args);  // <<<<<<<<<<<
  va_end(args);
}

【讨论】:

  • 如果 main 更改为 int a = 2, b = 28, c = 55 ; TRACE2((a,b,c)); 它会给出 Segmentation fault 。此时我需要做什么?
  • @w.jayson 那是另一个问题。基本上你会得到段错误,因为你没有提供格式字符串,例如"ece %d is of %d students, some other value: %d"。你需要学习printf
  • 谢谢,我以为 vprintf 和 printf 是不同的。
  • @w.jayson 错了,那不同的。阅读文档。
猜你喜欢
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2023-03-31
  • 2020-12-12
  • 2021-01-12
  • 1970-01-01
  • 2014-05-22
相关资源
最近更新 更多