代码之家  ›  专栏  ›  技术社区  ›  Matt Elson

用多个百分号格式化字符串

  •  5
  • Matt Elson  · 技术社区  · 7 年前

    我知道 %% % %%%ds %10s 在下面的格式字符串中,但我不知道为什么我需要 %%5s 在这个字符串中?

    毕竟,只有两个附加参数(BUFFSIZE/10)。

    #define BUFFSIZE 100
    char buf[100]={0}
    sprintf(buf, "%%5s %%%ds %%%ds", BUFFSIZE / 10, BUFFSIZE / 10);
    

    %10s %10s 
    
    3 回复  |  直到 7 年前
        1
  •  7
  •   Andre Kampling    7 年前

    其目的是获取一个格式字符串,以便在另一个需要类似格式字符串的函数中使用它 sscanf() .

    %5s %10s %10s 写信给您的 buf , see online ,这意味着它将接受三个带有长度标识符的字符串。

    %%5s          --> %5s
    %%%ds with 10 --> %10s (read it that way: {%%}{%d}{s})
    

    那个缓冲器 %5秒%10s%10s 如图所示呼叫 here .

    科尼根和派克在他们的书中也描述了这一点 The Practice of Programming here on SO .


    你可能无法使用的原因 %*s 可能是,见 here on SO

    printf printf("%*d", 4, 100); 指定字段宽度为4。

    scanf ,则*表示要读取但忽略该字段,因此。 scanf("%*d %d", &i) 对于输入,“12 34”将忽略12,并将34读入整数i。

        2
  •  2
  •   Sourav Ghosh    7 年前

    % C11 )

    % . 之后 按顺序出现:

    • 可选的最小字段宽度。

    • 可选精度[…]

    • 可选长度修饰符[…]

    然后,从P8开始,对于转换说明符

    转换说明符及其含义为:

    ......

    A. 字符已写入。未转换任何参数。完整的 %% .

     ....   %%%ds, BUFFSIZE / 10 ....
    

     {%%}{%d}{s}
      ^^--------------------------Replaced as %
          ^^----------------------Actual conversion specification happens, argument is used
             ^^------------------just part of final output
    

      %Xs    //where X is the value of (BUFFSIZE / 10)
    

    % ),稍后使用。

        3
  •  0
  •   chqrlie    7 年前

    OP正在根据参数大小计算格式字符串。给定参数,字符串将包含 %5s %10s %10s ,它可以与 printf scanf

    printf("%5s %10s %10s", "A", "B", "C");
    

    输出:

        A          B          C
    
    char a[6], b[11], c[11];
    scanf("%5s %10s %10s", a, b, c);
    

    a , b c

    然而,请注意 在这种情况下,没有必要按发布的方式计算字符串,因为您可以使用:

    printf("%5s %*s %*s", "A", BUFFSIZE / 10, "B", BUFFSIZE / 10, "C");
    

    不幸地 scanf() 将不同语义附加到 *