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.
53 Answers
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.
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.
3A 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).