C语言 在printf()格式说明符中使用字段宽度变量

bnl4lu3b  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(103)

我尝试使用一个变量来设置printf()格式说明符中的动态字段宽度。我搜索了网站,发现以下似乎只是我需要的帮助。
Set variable text column width in printf
当我使用“%*1$d%*2$s”时,我得到以下错误。

ex8_3.c:29:11: warning: missing $ operand number in format [-Wformat=]
   29 |    printf("The value entered, in characters, was \"%*1$d%*2$s\".\n", fieldWidth, string);
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

字符串
但是,当我使用“%1$*d%2$*s”时,我得到以下错误。

ex8_3.c: In function ‘main’:
ex8_3.c:29:4: warning: missing $ operand number in format [-Wformat=]
   29 |    printf("The value entered, in characters, was \"%1$*d%2$*s\".\n", fieldWidth, string);
      |    ^~~~~~


请注意两个语句中星号的不同位置。根据编译器的说法,第二个版本似乎是“更正确”的一个。在这两种情况下,我不明白的是错误消息中提到的“缺少$ operand数”。printf()使用两个变量,我提供了两个“$ operand number”的示例。鉴于上面链接的网页中的例子,我只是不明白我做错了什么/不理解。有人能解释一下错误消息指的是什么,我需要实施什么更正吗?
下面是有问题的代码。

int main(void)
{
   int number = 0;                                 // Value supplied by user.
   int arraySize;                                  // Size of the digit array.
   int fieldWidth = 0;                             // Allow variable field width in printf().
   
   number = readValue();                           // Read in value from user.
   arraySize = countDigits(number) + 2;            // Get array size.
   fieldWidth = arraySize + 2;                     // Set variable field width for printf().
   
   char string[arraySize];                         // Define array to hold digit characters.
   itoa(number, string);                           // Convert value to string.
   printf("The value entered, in characters, was \"%1$*d%2$*s\".\n", fieldWidth, string);
   return 0;
}


下面是正在使用的命令行。

gcc ex8_3.c -Wall -std=c11 -ggdb -o ex8_3

rryofs0p

rryofs0p1#

看起来您试图使用%n$(要打印的字段)和*m$(宽度)来使用POSIX位置参数。这里的width修饰符需要在 * number之后提供,以选择要打印的参数:

printf("... was \"%2$*1$s\".\n", fieldWidth, string);

字符串

  • %2$-要打印的参数,string
  • *1$-保存宽度的参数fieldWidth
  • s-字段是字符串

你会得到同样的输出,但要简单得多:

printf("... was \"%*s\".\n", fieldWidth, string);

相关问题