Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to store the character '\b' and make it be recognized by the file of c program

When I read the C Programming Language and do the exercise 1-10, there is a problem made me puzzled.

It's said that when I enter a backspace, the character is processed by the console driver and not delivered to the program, so what I can do is create a file with embedded backspace.However, it's seemed useless no matter I directly enter '\b' or press Ctrl + H.

When I press Ctrl + H, the screen will show "\b", but when I run the program, it seems that the program will still see it as two characters '\' and 'b'. No matter what I enter, it never shows "\backspace" when I run the program.

What should I do to make the program recognize it as a character of backspace?

My codes are like following:

#include <stdio.h>
int main()
{
    int c;
    while((c=getchar())!=EOF){
        if(c=='\t')
            printf("\\t");
        else if(c=='\\')
            printf("\\\\");
        else if(c=='\b')
                 printf("\\backspace");
             else
                 putchar(c);
     }
}
like image 692
Harukaze Avatar asked Jan 19 '16 03:01

Harukaze


2 Answers

I don't think the problem is with your code, but with the way you wrote the backspace character in your text editor.

You have to use a special key combination in vim to enter control characters such as backspace. In your case, you should type ctrl + v followed by ctrl + h. That should produce a real backspace character.

To see whether you have produced an actual backspace character, you can use hexdump:

$ hexdump myfile
00000000  68 65 6c 6c 6f 20 08 77  6f 72 6c 64              |hello .world|
                            ^^

Notice the 08, which is the backspace character (in C, it's denoted \b).


Another way to produce the backspace character is to simply write it via a program in C:

#include <stdio.h>
int main(void) {
    FILE *f = fopen("myfile", "w");
    fputs("hello \bworld", f);
    fclose(f);
    return 0;
}
like image 116
Rufflewind Avatar answered Sep 30 '22 04:09

Rufflewind


The problem is not really in your program, but, like you said, in your terminal driver. The odd behaviour, as observed by your program, is a consequence of the Unix terminal model.

Notice that after you press Tab, you probably also have to press Enter before your program sees the Tab as a \t character. That means that your terminal is in "cooked" mode (i.e., not raw mode). Similarly, the terminal driver will handle Ctrl + H before your program's getchar() will ever get a chance to see it.

What you can do is run stty -icanon before launching your program. (Alternatively, you can do it programmatically within your program's initialization routine.) Then, keystrokes such as Tab and Ctrl + H keypress will be instantly picked up by getchar(), literally.

To restore the default terminal behaviour, use stty icanon or stty sane.

like image 33
200_success Avatar answered Sep 30 '22 03:09

200_success