我们可以在C中的printf中为许多格式描述符使用一个变量吗?

时间:2017-09-20 11:07:07

标签: c variables printf

是否可以编写类似我在下面编写的代码?

printf("\n%c%c\n%c",only_one_variable_for_all);
printf("%c%c%c\n",only_one_variable_for_all);

我必须在每种情况下以不同的图案打印 你能提出任何其他想法吗?

3 个答案:

答案 0 :(得分:3)

不,这是不可能的。

引用C11,章节§7.21.6.1, fprintf() (适用于*printf()家庭,所有重点都是我的)

  

fprintf函数将输出写入流控制的流所指向的流   format指向的字符串,指定后续参数的方式   转换为输出。 如果format的参数不足,则行为为   未定义。如果参数保留时format已用尽,则多余的参数为   评估(一如既往),否则被忽略。 [...]

,对于包含转换说明符的format字符串,

  

format应为多字节字符序列,以其首字母开头和结尾   转移状态。 format由零个或多个指令组成:普通的多字节   字符(不是%),不加改变地复制到输出流;和转换   规范,每个规范都会导致获取零个或多个后续参数,   根据相应的转换说明符转换它们(如果适用)   然后将结果写入输出流。**

因此,底线,每个转换规范需要零个或多个“对应”参数,并且一个参数不能对应format字符串中的多个转换规范。每个转换规范都需要自己的参数。

解决方案:

如果您想多次打印相同的变量,就像您显示的那样,

 printf("\n%c%c\n%c",only_one_variable_for_all);

你可以简单地使用循环!!

 for (int i = 0; i < SOME_SIZE; i++ ) 
 { 
      printf ("%c", only_one_variable ); 

      /* some more logic for line break?*/

 }

答案 1 :(得分:1)

C标准不允许这样做,但在POSIX系统上你可以这样做:

printf("%1$d %1$d %1$d\n", 17);

POSIX说:

  

转换可以应用于参数列表中格式之后的第n个参数,而不是下一个未使用的参数。在这种情况下,转换说明符字符%(见下文)被序列“%n $”替换,其中n是[1,{NL_ARGMAX}]范围内的十进制整数,给出参数在参数中的位置列表。

这是一个相对未知的扩展,所以要为即使非常有经验的C程序员做好准备,不要知道它,如果你使用它就会对你大喊大叫。 (它将无法进行代码审查)。此外,它甚至不打算用于重复一个参数,而是用于翻译格式字符串,其中某些语言可能希望以不同的顺序打印事物。所以我建议不要使用它。只需写出变量多次。不要偷懒。

答案 2 :(得分:0)

没有。这是不可能的。每个格式说明符都需要相应的参数。

但是,您可以通过多种方式解决此问题,具体取决于您要多次打印的内容。 例如,您可以创建包含字符的C字符串并将其打印出来。

char str[] = {ch, ch, ch, 0};
printf("%s", str);

或者使用循环根据需要多次打印值。但是没有通用的解决方法。