是否可以编写类似我在下面编写的代码?
printf("\n%c%c\n%c",only_one_variable_for_all);
printf("%c%c%c\n",only_one_variable_for_all);
我必须在每种情况下以不同的图案打印 你能提出任何其他想法吗?
答案 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);
或者使用循环根据需要多次打印值。但是没有通用的解决方法。