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

Posted

技术标签:

【中文标题】如何将退格键更改为 \'\\b\'?【英文标题】:how can I change backspace to '\b'?如何将退格键更改为 '\b'? 【发布时间】:2014-11-13 00:48:50 【问题描述】:

我在《The C programming language》中看到一个问题,是这样的: 编写一个程序将其输入复制到其输出,用 \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',即我的意思是,我怎样才能输出退格?

【问题讨论】:

你得到了什么输出?选项卡的行为是否正确? 我认为没有一个简单的答案。这取决于您的终端等 - 它可能会缓冲您键入的所有内容,然后在您按 Enter 时将其发送到您的程序。如果是这种情况,它可能会为您处理退格,而您的程序将永远不会看到它们。 我相信puts可能效率更高,比如puts("\\t");。它将两个函数调用替换为一个。 switch 语句更易读,恕我直言。 您的 else 仅与最后一个 if 相关联,因此您在 '\t' 和 '\b' 的转义序列之后打印原始字符......所以实际退格字符可能会在您打印后吃掉“b”。 【参考方案1】:

键盘输入由操作系统预处理。大多数字符直接作为输入输入到您的程序中,但有些字符是经过特殊处理的。

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

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

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

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

【讨论】:

不错的答案,您可以使用getch() 检测每个按键 @Ludovic:至少有两个函数叫做getch。一种是特定于 Windows 的;另一个是 [n] 个诅咒的一部分。 不知道,谢谢!我会努力改进我的答案【参考方案2】:

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;

Enter 被 getch 检测为\r,所以如果你想进入下一行,你必须手动将其替换为\n

【讨论】:

【参考方案3】:

退格键通常会被 shell 吃掉。使用“crtl-h”来测试退格。

查看此页面了解更多详情http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html

【讨论】:

仅当您的配置导致 Backspace 键发送 DEL 字符时才有效。【参考方案4】:

在您的代码中,您有三个 ifs,最后只有一个 else...所以您的 else 只与最后一个 if 相关联。对于制表符和退格,因为它们不是反斜杠,所以最后一个if 测试为假,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);
    

【讨论】:

以上是关于如何将退格键更改为 '\b'?的主要内容,如果未能解决你的问题,请参考以下文章

如何将加速键赋予键盘退格键

如何检测是不是按下退格键?

当使用退格键或删除按钮提交按钮颜色不改变

如何检测网站上是不是按下了退格键?

前端javascript如何阻止按下退格键页面回退 但 不阻止文本框使用退格键删除文本

Linux下,编译文本时,输入内容后,无法使用退格键删除,退格键成了方向键,