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

时间:2019-06-17 13:51:11

标签: c printf

说我有一个带有许多参数的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

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:2)

您可以通过指定零宽度来抑制字符串(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;
}

答案 2 :(得分:1)

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

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

我能想到的唯一(不是很优雅)的解决方案与您想要实现的功能类似,它是创建一个这样的宏:

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

这会将参数替换为空终止符。

然后您可以像下面这样在您的printf语句中使用它:

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

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

答案 3 :(得分:0)

我不确定您使用抑制的含义是什么,但是一种(复杂的)更改输出的方式(您可能(或可能不需要))是使用一个字符串变量来表示{ 1}},例如

printf

此方法的缺点是您仍然必须按顺序打印A,B,C和D,但是您当然可以用一个或多个数字周围的文本来“标记”不同的内容。

如果char format[20]; int A, B, C, D; strcpy(format, "%d %d %d %d"); if (C==0) strcpy(format, "%d %d [%d] %d"); printf(format, A,B,C,D); 则打印int A=2, B=3, C=0, D=0;,但是如果2 3 [0] 0则打印int A=2, B=3, C=1, D=0;

如果这是您要取消显示的最后一个数字,则可以使用....

2 3 1 0

但是我认为这不一定是好的做法。这将取决于'printf'对获得额外参数的反应。...

现在,如果char format[20]; int A, B, C, D; strcpy(format, "%d %d %d %d"); if (D==0) strcpy(format, "%d %d %d"); printf(format, A,B,C,D); ,则输出为2 3 0 1;如果int A=2, B=3, C=0, D=1;,则输出为2 3 0

最后,您可以使用下面的代码取消显示

int A=2, B=3, C=0, D=0;

因为'\ b'会退格,所以如果您的终端在char format[20]; int A=2, B=3, C=0, D=1; strcpy(format, "%d %d %d %d"); if (C==0) strcpy(format, "%d %d %d\b\b %d"); printf(format, A,B,C,D); 上表现良好,那么您应该可以在中间隐藏一个数字-请注意,该数字最后不能使用该数字,因为{ {1}}可移动光标,但不会擦除光标,因此您之后需要打印一些空白