我正在try 使用一个变量在一个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);
      |    ^~~~~~

请注意两个语句中星号的不同位置. 根据编译器的说法,第二个版本似乎是"更正确的"版本.在这两种情况下,我都不理解的是错误消息中提到的"缺少$操作数".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

推荐答案

看起来您正在try 使用POSIX位置参数,使用%n$(要打印的字段)和*m$(宽度).这里需要向宽度修饰符提供after Select 要打印哪个参数的数字:

printf("... was \"%2$*1$s\".\n", fieldWidth, string);
  • %2$-要打印的参数,string
  • *1$-保留宽度的参数,fieldWidth
  • s-并且该字段为字符串

您将获得与简单得多的输出相同的输出:

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

C++相关问答推荐

字符串令牌化xpath表达式

单指针和空参数列表之间的函数指针兼容性

由Go调用E.C.引起的内存快速增长

SDL 2.0-从数组渲染纹理

如果我释放其他内容,返回值就会出错

C由四个8位整数组成无符号32位整数

用C宏替换strncMP函数中的参数

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

GCC创建应用于移动项的单独位掩码的目的是什么?

SSH会话出现意外状态

有什么方法可以将字符串与我们 Select 的子字符串分开吗?喜欢:SIN(LOG(10))

为什么数组的最后一个元素丢失了?

如何在C++中安全地进行浮点运算

C堆栈(使用动态数组)realloc内存泄漏问题

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

使用ld将目标文件链接到C标准库

Zlib:解压缩大文件导致";无效代码长度设置";错误

判断系统命令返回值的正确方法

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?