如何将退格键更改为' \ b'?

时间:2014-11-13 00:48:51

标签: c++ c visual-c++

我在“C编程语言”中看到一个问题,它是这样的: 编写程序将其输入复制到其输出,用\ t替换每个选项卡,用\ b替换每个退格,用\替换每个反斜杠。这使标签和

退格以明确的方式显示。 然后我写了一个这样的程序

#include<stdio.h>
int main(void)
{
    int c;
    while((c=getchar())!=EOF)
    {
        if(c=='\t')
        {
            putchar('\\');
            putchar('t');
        }
        if(c=='\b')
        {
            putchar('\\');
            putchar('b');
        }
        if(c=='\\')
        {

            putchar('\\');
            putchar('\\');

        }
        else{
            putchar(c);

        }


    }
    return 0;



}

但是当我输入退格键时,我无法得到'\ b',所以如何得到输出'\ b',即。我的意思是,我如何输出退格?

4 个答案:

答案 0 :(得分:4)

键盘输入由操作系统预处理。大多数字符直接作为输入提供给您的程序,但有些字符是专门处理的。

在类UNIX系统上,标准输入通常是行缓冲的。系统会读取整行文本,并且在您按 Enter 之前不会将其传递给您的程序。在读取该行时,系统处理 Backspace 本身;它不是在缓冲区中添加退格符,而是删除最新的字符。您的程序永远不会看到'\b'字符。

要输入程序可以看到的文字退格符,在类UNIX系统上,可以在其前面加上Ctrl-V。根据您的tty和终端仿真器设置,键入 Backspace 键可能会传输ASCII DEL字符而不是退格。要确保程序看到退格符,请键入 Ctrl-V Ctrl-H

在非类UNIX系统(很可能是Windows)上,可能有一种类似的方法,但我不知道它是什么。

您还可以使用文件输入来运行程序。在输入文件中输入文字退格字符作为练习(取决于文本编辑器的工作方式)。

答案 1 :(得分:1)

getchar功能缓冲用户输入并仅在用户按回车键时将其发送到您的程序。根据建议,您必须使用getch()来检测每个按键

您的代码必须是:

#include<stdio.h>
#include<conio.h>
int main(void)
{
    int c;
    while ((c = getch()) != EOF)
    {
        if (c == '\t')
        {
            putchar('\\');
            putchar('t');
        }
        else if (c == '\b')
        {
            putchar('\\');
            putchar('b');
        }
        else if (c == '\\')
        {
            putchar('\\');
            putchar('\\');
        }
        else if (c == '\r')
        {
            putchar('\n');
        }
        else{
            putchar(c);
        }
    }
    return 0;
}
getch将{p> Enter检测为\r,因此如果您想转到下一行,则必须手动将其替换为\n

答案 2 :(得分:0)

退格通常被外壳吃掉。使用&#34; crtl-h&#34;测试退格。

有关详细信息http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html

,请参阅此页面

答案 3 :(得分:0)

在您的代码中,您有三个if,最后只有一个其他人...所以您的其他内容仅与最后一个if相关联。对于制表符和退格键,由于它们不是反斜杠,因此最后if测试为false,else块执行打印原始字符。这意味着在打印'\ t'后打印一个标签(可能会在输出中看到一些空白区域),打印'\ b'后打印一个退格区,它会吃'b'或导致它被下一个覆盖字符。要修复它,请使用:

    if(c == '\t')
    {
        putchar('\\');
        putchar('t');
    }
    else if(c=='\b')    /* "else if" rather than "if" */
    {
        putchar('\\');
        putchar('b');
    }
    else if(c=='\\')
    {
        putchar('\\');
        putchar('\\');
    }
    else{
        putchar(c);
    }

...或者只是用开关重写它:

    switch(c)
    {
        case '\t':
            puts("\\t");
            break;
        case '\b':
            puts("\\b");
            break;
        case '\\':
            puts("\\\\");
            break;
        default:
            putchar(c);
    }