对于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}的十进制整数,给出