C程序输出格式不正确(使用\ t)

时间:2018-06-29 20:05:41

标签: c

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

#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;
}

给出以下输出:

enter image description here

我想要的输出是这样的:
enter image description here

6 个答案:

答案 0 :(得分:30)

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

因此,如果您打印\t,它将跳到第8列,但是如果您打印***,您已经是第8列,那么它将跳到第16列。

答案 1 :(得分:13)

精度和宽度字段可用于格式化。 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 :(得分:13)

  

...为什么我的输出混乱了(?)

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


明智地使用'-'标志 字段宽度 precision ,可以简化代码以打印出字符。

#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 :(得分:8)

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

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

答案 4 :(得分:4)

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

在打印了第一组星号之后,请打印空格,直到您打印了足够的字符以按需要隔开为止。

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

答案 5 :(得分:2)

我会这样:

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'字符没有固定宽度。