说我有一个带有许多参数的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
答案 0 :(得分:12)
如果您出于某些原因必须即时更改这些内容,请保持简单:
printf("%d ", A);
printf("%d ", B);
if(c)
printf("%d ", C);
printf("%d ", D);
答案 1 :(得分:2)
您可以通过指定零宽度来抑制字符串(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;
}
答案 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}}可移动光标,但不会擦除光标,因此您之后需要打印一些空白