Reputation: 1534
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
Reputation: 1
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
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
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
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