繁体   English   中英

如何在C中的printf中吞下参数

[英]How to swallow a parameter in printf in C

假设我有一个带有许多参数的 printf:

printf("%d %d %d %d", A, B, C, D);

出于某种原因,我希望不再打印一个参数,但仍将其列在参数列表中(例如出于视觉原因,或者它可能是具有必要副作用的函数调用等)。

我可以用没有输出的转换字母替换 %d 吗? 我不记得有这样一封转换信。 或者也许玩旗帜......?

[编辑] 我刚刚注意到 scanf 有类似的东西(但相反):赋值抑制标志“*”。 例如sscanf("123 345 678", "%i %*i %i", &a, &b)将导致 a=123 b=678

如果您出于某种原因必须即时更改这些,请保持简单:

printf("%d ", A);
printf("%d ", B);
if(c) 
  printf("%d ", C);
printf("%d ", D);

您可以通过指定零宽度来抑制字符串 ( char* ) 参数。

但是,我知道无法抑制数字( intfloat )值。

int main(void) {
    int a=1;
    char*  b="hello";  // Gets Suppressed
    int c=3;

    printf("%d %.0s %d\n", a, b, c); // .0 means "zero-width"
    return 0;
}

首先,我同意 Radosław Cybulski 的评论:依赖副作用是一件危险的事情。 所以请不要那样做。

至于抑制参数的打印,我认为没有内置的占位符,最好只注释掉整个 printf 语句并在其下方添加没有抑制参数的版本。

话虽如此,我可以提出两个(不是很优雅的)解决方案,它们的作用类似于您想要实现的目标:

方法一

你可以创建一个这样的宏:

#define SUPPRESS_PRINT(x) "\\0"/*x*/

这将用空终止符替换参数。

然后你可以在你的 printf 语句中使用它,如下所示:

printf("%d %d %s %d", A, B, SUPPRESS_PRINT(C), D);

请注意,C 的占位符(即被抑制的参数)必须更改为 %s,它是一个空终止字符串,以便此“技巧”产生所需的结果。

更正:

由于 jhx 在评论中提出了很棒的建议,我已经增强了上述解决方案。 使用顺序评估可能的副作用不会被忽略。 修改后的宏如下所示:

#define SUPPRESS_PRINTF_ARG(x) ((x), "")

用法将保持与上述相同。


方法二

还有另一种可能更简单的解决方案。 它是 POSIX 功能而不是 C99 功能,但它可以在我假设的大多数情况下工作。 它是在每个格式占位符中使用一个参数字段。 像这样的东西:

printf("%1$d %2$d %3$d %4$d", A, B, C, D);

然后如果你想省略让我们说参数 C 被打印,你可以从格式字符串中删除 %3$d 。 从而得到这个:

printf("%1$d %2$d %4$d", A, B, C, D);

这可能是最简单的方法。

工作原理:参数字段使用其序号将格式占位符与给定参数联系起来。 因此,即使您删除了一个,其余的仍然可以正确打印。

注意:就我的测试而言,此方法不会忽略副作用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM