【问题标题】:C program output not formatting properly(using \t)C 程序输出格式不正确(使用 \t)
【发布时间】:2018-06-29 20:05:41
【问题描述】:

我只是想知道为什么我的输出搞砸了。代码如下。我是初学者,所以请原谅我缺乏技能。任何帮助将不胜感激。

#include <stdio.h>

int main(int argc, char *argv[]) 
{

    for (int i = 1; i <= 10; i++)
    {

        for (int j = 1; j <= i; j++)
        {
            printf("*");
        }
        printf("\t");
        for (int k = 1; k <= 11-i; k++)     
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

给出这个输出:

我想要的输出是这样的:

【问题讨论】:

  • 请在此处以纯文本形式发布代码、错误、示例数据或文本输出,而不是难以阅读的图像,不能复制粘贴以帮助测试代码或在答案中使用,并且对使用屏幕阅读器的人怀有敌意。您可以编辑问题以在问题正文中添加代码。使用{} 按钮来格式化任何代码块,或者使用四个空格缩进以获得相同的效果。 很遗憾,我们无法将您的屏幕截图作为代码运行。
  • 另外,请添加所需的输出。
  • 添加了代码。
  • printf \t option的可能重复
  • 我强烈怀疑这个分配的意图是打印两个模式一个接一个,即模式A,然后是模式B在下面屏幕。具体来说:它与 Gaddis、Starting Out with C++、Programming Challenge Ch. 完全匹配。 5, #23 (包括行和列的确切数量、命名约定 A/B 等),我也在查看符合预期的本书解决方案......

标签: c


【解决方案1】:

精度和宽度字段可用于格式化。 Precision 将打印最多指定数量的字符,而 width 将至少打印指定数量的字符。在任一字段中使用星号都允许为可变数量的字符提供参数。

#include <stdio.h>

int main( void) {
    char asterisk[] = "***********";

    for (int i = 1; i <= 10; i++)
    {
        printf ( "%.*s", i, asterisk);//print up to i characters
        printf ( "%*s", 15 - i, " ");//print at least 15 - i characters
        printf ( "%.*s", 11 - i, asterisk);
        printf("\n");
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    ...为什么我的输出搞砸了(?)

    代码使用制表符'\t' 仅与下一个制表位对齐 - 通常每 8 列对齐,并且所需的星数超过 8。


    通过明智地使用'-' 标志字段宽度精度,可以简化代码以打印字符数组。

    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
      int n = 10;
      char stars[n];
      memset(stars, '*', n);
    
      for (int i = 0; i < n; i++) {
        //       +------------- - flag: pad on right     
        //       |+------------ field width: min characters to print, pad with spaces
        //       || +--------+- precision: max numbers of characters of the array to print
        printf("%-*.*s     %.*s\n", n, i + 1, stars, n - i, stars);
        //                          |  ^^^^^         ^^^^^ precision
        //                          +--------------------- field width
      }
    }
    

    输出

    *              **********
    **             *********
    ***            ********
    ****           *******
    *****          ******
    ******         *****
    *******        ****
    ********       ***
    *********      **
    **********     *
    

    注意:stars 不是 字符串,因为它缺少 空字符。使用 "%s" 的精度允许 printf() 使用简单的字符数组。数组中的字符最多写入(但不包括)终止空字符。

    【讨论】:

      【解决方案3】:

      制表位不是固定宽度的空格(例如,与 4 个空格或 8 个空格相同),这意味着输出设备应将插入符号(或打印头)移动到表格数据的下一列位置.这些列位置是固定的固定间隔,这就是为什么\t****\t 具有不同的打印宽度:

      String        Output:
      "\t**a"       "    **a" (7 wide)
      "**\ta"       "**  a"   (5 wide)
      

      【讨论】:

      • 这是有道理的。那么我会添加什么来代替间距呢?我尝试只使用 printf(" "),这使间距正确,但没有输出我想要的结果。
      【解决方案4】:

      正如其他人所提到的,打印制表符将光标移动到下一个制表位,而不是一定数量的空格。

      在打印第一组星号后,打印空格,直到打印出足够的字符以根据需要进行空格。

          for (int j = 1; j <= 10; j++)
          {
              if (j<i) {
                  printf("*");
              } else {
                  printf(" ");
              }
          }
      

      【讨论】:

        【解决方案5】:

        我会这样做:

        const int rows = 10;
        for (int i = 0; i < rows; i++) {
            const int width = 10;
            const int space = 5;
            const int totalw = 2*width + space;
            for (int j = 0; j < totalw; j++) {
                char ch = j<=i || (j>=width+space && j<(totalw-i)) ? '*' : ' ';
                printf("%c", ch);
            }
            printf("\n");
        }
        

        即使在其他答案中提到,也只是为了完整性。 '\t' 字符没有固定宽度。

        【讨论】:

          【解决方案6】:

          \t 停在下一个可到达的标签位置,默认情况下是 8 的倍数。

          因此,如果你打印***,它会跳到第8列,但是如果你打印*********,你已经过了8,所以它会跳到第16列。

          【讨论】:

          • 这是有道理的。那么我会添加什么来代替间距呢?我尝试只使用 printf(" "),这使间距正确,但没有输出我想要的结果。
          • 只是要指出,默认情况下它确实是一个选项卡的 8 个字符宽度,但如果您使用的是 *nix 终端,则可以更改它。如果它是一个 IDE - 可能会或可能不会作为选项提供
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-28
          • 1970-01-01
          • 2013-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多