Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why do we use \r and \b in C?

Tags:

c

Why do we use \r and \b in C? I know that \b makes "hello\bworld" into "hellworld". but we can just write "hellworld" instead of "hello\bworld". So, what purpose does it serves in a program? This question describes what \b do , but doesn't clarify why it is used.

like image 621
Miraz Avatar asked Dec 17 '22 12:12

Miraz


2 Answers

Its' to a large degree just historical reasons. Many characters can actually be traced back to analogue typewriters! In the past, you had computers with matrix printers instead of monitors. In those days, bold font was achieved by printing something twice in the same location.

For example, in Linux we use the character \n for a new line, but in Windows it is \r\n so what is those characters? Well \n (newline) is to move the head of the typewriter one line down and \r is the carriage return, which returns the typewriter carriage to the beginning of the line.

Many of these characters are not used very much anymore. They are mostly considered legacy. They are not really that useful in modern programming. You can use \b to go back and overwrite stuff that you have previously written, but today you would use libraries like ncurses to achieve the same thing. In the old days, you could actually use these to get pretty exact positioning of stuff, but on modern terminal emulators, that's no longer the case. For instance, old terminals had fixed sizes. The sizes may not have been standardized, but they did not change during runtime and were the same for the same machine every time you run a program.

I could consider using \b and \r if I wanted to write a cli application with some kind of progress bar. Example:

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int n = 0;
    while(n<=100) {
        printf("\rProgress: %d\%", n);
        fflush(stdout);
        sleep(1);
        n+=10;
    }
}

You could achieve the same thing with \b instead of \r, but mostly it's easier to just reprint the whole line. I cannot see any situation where I would use \b in code.

A similar thing can be done if you want to simulate human writing in a text based game. But I would say that these kind are mostly for the case where you don't have the time and/or energy to learn how to use proper modern methods.

Let's look at the first 32 characters in the ascii table:

0   Null char
1   Start of Heading
2   Start of Text
3   End of Text
4   End of Transmission
5   Enquiry
6   Acknowledgment
7   Bell
8   Back Space
9   Horizontal Tab
10  Line Feed
11  Vertical Tab
12  Form Feed
13  Carriage Return
14  Shift Out / X-On
15  Shift In / X-Off
16  Data Line Escape
17  Device Control 1 (oft. XON)
18  Device Control 2
19  Device Control 3 (oft. XOFF)
20  Device Control 4
21  Negative Acknowledgement
22  Synchronous Idle
23  End of Transmit Block
24  Cancel
25  End of Medium
26  Substitute
27  Escape
28  File Separator
29  Group Separator
30  Record Separator
31  Unit Separator

Almost all of these have been replaced by other things. For instance by higher level protocols, like tcp and such, but also by libraries like ncurses. In C, the null character is useful for strings, but it could have been solved in other ways, like making it possible to retrieve the size of an array when it's passed to a function.

like image 73
klutt Avatar answered Dec 31 '22 00:12

klutt


You use them to overwrite something you wrote previously. You wouldn't normally use them in the same string, but in different output calls, e.g.

printf("hello");
fflush(stdout); // need to flush because we didn't write a newline
// do some stuff here
printf("\rgoodbye\n"); // This replaces hello
like image 43
Barmar Avatar answered Dec 31 '22 02:12

Barmar