[英]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*
) 参数。
但是,我知道无法抑制数字( int
和float
)值。
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.