对于C中的printf中的多个格式描述符,我们可以只使用一个变量吗

对于C中的printf中的多个格式描述符,我们可以只使用一个变量吗,c,variables,printf,C,Variables,Printf,是否可以像我在下面写的那样编写代码 printf("\n%c%c\n%c",only_one_variable_for_all); printf("%c%c%c\n",only_one_variable_for_all); 我必须在每种情况下打印不同的图案 你能提出其他想法吗?不,这是不可能的 引用C11,第§7.21.6.1章,fprintf()(适用于*printf()系列,所有强调型) fprintf函数将输出写入受控制的流所指向的流 由format指向的字符串的,该字符串指定后续参数的

是否可以像我在下面写的那样编写代码

printf("\n%c%c\n%c",only_one_variable_for_all);
printf("%c%c%c\n",only_one_variable_for_all);
我必须在每种情况下打印不同的图案
你能提出其他想法吗?

不,这是不可能的

引用
C11
,第§7.21.6.1章,
fprintf()
(适用于
*printf()
系列,所有强调型)

fprintf
函数将输出写入受控制的流所指向的流 由
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?*/

 }
for(int i=0;i
不,这是不可能的

引用
C11
,第§7.21.6.1章,
fprintf()
(适用于
*printf()
系列,所有强调型)

fprintf
函数将输出写入受控制的流所指向的流 由
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?*/

 }
for(int i=0;i
不,这是不可能的。每个格式说明符都需要各自的参数

但是,根据要多次打印的内容,可以通过多种方式解决此问题。 例如,您可以创建包含字符的C字符串并打印它

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

或者使用循环按需要多次打印值。但是没有通用的方法来解决这个问题。

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

但是,根据要多次打印的内容,可以通过多种方式解决此问题。 例如,您可以创建包含字符的C字符串并打印它

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

或者使用循环按需要多次打印值。但是没有通用的方法来解决这个问题。

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

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

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


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

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

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

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