Chao Zhang
Chao Zhang

Reputation: 1534

How many spaces for tab character(\t)?

I want to implement a text drawing function. But I am not sure how \t works, which means I don't know how many spaces I should print for \t.

I have come up with the following algorithm:

a) Each \t represents at most NUMBER_OF_SPACES_FOR_TAB spaces. b) If \t appears in the last line at a corresponding position, \t for this line should be aligned to the \t of last line.

Example:

printf("a\t\tb\n");
printf("\t\tc\n");

Should print:

a11112222b
34444c

Where:

1.Number i represents the spaces of \t at position i

2.NUMBER_OF_SPACES_FOR_TAB == 4

Does anyone know the standard algorithm? Thanks in advance.

Upvotes: 24

Views: 143794

Answers (4)

By default, an output terminal consists of 25 rows and 80 columns. A set of 8 columns is called a frame, so your output terminal has a total of 10 frames on each row.

Whenever the compiler see '\t', it moves the courser to the next available frame. So '\t' can sometimes seem to give 3 spaces, other times 1, it all depends on how far the next frame is.

  • Example 1:

    printf("Hell\to")
    

    Will output:

    "Hell    o"
    

    There's a total of 4 spaces, as the next frame is 4 spaces apart.

  • Example 2:

    printf("happily\tmarried")
    

    Will output:

    "happily        married"
    

    There's a total of 8 spaces, as the next frame is 8 spaces apart.

Upvotes: 0

Mark Ransom
Mark Ransom

Reputation: 308206

A tab character should advance to the next tab stop. Historically tab stops were every 8th character, although smaller values are in common use today and most editors can be configured.

I would expect your output to look like the following:

123456789
a       b
        c

The algorithm is to start a column count at zero, then increment it for each character output. When you get to a tab, output n-(c%n) spaces where c is the column number (zero based) and n is the tab spacing.

Upvotes: 37

John Kugelman
John Kugelman

Reputation: 361625

Imagine a ruler with tab stops every 8 spaces. A tab character will align text to the next tab stop.

                                0       8       16      24      32      40
                                |.......|.......|.......|.......|.......|
printf("\tbar\n");              \t      bar
printf("foo\tbar\n");           foo\t   bar
printf("longerfoo\tbar");       longerfoo\t     bar

To calculate where the next tab stop is, take the current column.

nextTabStop = (column + 8) / 8 * 8

The / 8 * 8 part effectively truncates the result to the nearest multiple of 8. For example, if you're at column 11, then (11 + 8) is 19 and 19 / 8 is 2, and 2 * 8 is 16. So the next tab stop from column 11 is at column 16.

In a text editor you may configure tab stops to smaller intervals, like every 4 spaces. If you're simulating what tabs look like at a terminal you should stick with 8 spaces per tab.

Upvotes: 32

Whyrusleeping
Whyrusleeping

Reputation: 929

A Tab character shifts over to the next tab stop. By default, there is one every 8 spaces. But in most shells you can easily edit it to be whatever number of spaces you want (profile preferences in linux, set tabstop in vim).

Upvotes: 8

Related Questions