如何存储字符'\b'并使其被c程序文件识别

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

在看《C程序设计语言》做习题1-10的时候,有个问题让我百思不得其解。

据说当我输入退格键时,字符是由控制台驱动程序处理的,并没有传递给程序,所以我只能做一个嵌入的文件backspace.However,这似乎没有用不管我直接输入'\b'或者按Ctrl + H.

当我按Ctrl + H时,屏幕会显示“\b”,但是当我运行程序时,程序好像还是会看到它作为两个字符 '\' 和 'b'。无论我输入什么,当我 运行 程序时它都不会显示“\backspace”。

如何让程序识别为退格字符?

我的代码如下:

#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);
     }
}

BackspaceASCII 代码 8.

因此您可以在读取文件时检查 c == 0x08

else if(c == 0x08)
    printf("\backspace");

您可能需要查看 this

我认为问题不在于您的代码,而在于您在文本编辑器中编写退格字符的方式。

您必须使用 special key combination in vim to enter control characters,例如退格键。在你的情况下,你应该键入 ctrl + v 然后是 ctrl + h 。这应该会产生一个真正的退格字符。

要查看您是否产生了实际的退格字符,您可以使用 hexdump:

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

注意 08,这是退格字符(在 C 中,表示为 \b)。


产生退格字符的另一种方法是通过 C:

中的程序简单地编写它
#include <stdio.h>
int main(void) {
    FILE *f = fopen("myfile", "w");
    fputs("hello \bworld", f);
    fclose(f);
    return 0;
}

问题不在你的程序中,而是如你所说,在你的终端驱动程序中。正如您的程序所观察到的那样,奇怪的行为是 Unix 终端模型的结果。

请注意,在您按下 Tab 之后,您可能还必须在程序看到 Tab 之前按下 Enter 作为 \t 字符。这意味着您的终端处于 "cooked" 模式(即,不是原始模式)。同样,终端驱动程序将在您的程序 getchar() 有机会看到它之前处理 Ctrl + H

您可以做的是 运行 stty -icanon 在启动您的程序之前。 (或者,您可以在程序的初始化例程中 do it programmatically。)然后,诸如 TabCtrl + H 按键的按键将被立即被 getchar() 拾起,字面意思。

要恢复默认终端行为,请使用 stty icanonstty sane