【问题标题】:Understand backspace (\b) behaviour in C了解 C 中的退格 (\b) 行为
【发布时间】:2013-09-04 08:44:11
【问题描述】:

此程序将其输入复制到其输出,将 TAB(\t) 替换为 \t 退格 (\b) 替换为 \b。 但是在我的代码中,当我输入退格键时,我无法读取输入字符,它不会像选项卡一样替换。

在 Linux 中使用 GCC 编译:

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

假设如果我输入 vinay (tab) hunachyal

Output:vinay\thunachyal 

如果我输入 vinay(和 1 个退格键)

Output:vina

所以我的问题是为什么vina\b 在这种情况下不打印?
是否可以检测到\b 并打印\b?如果不是什么原因

Note: 我需要在运行时输入退格不提供具有 \b 的单独文件

【问题讨论】:

    标签: c backspace


    【解决方案1】:

    退格键被 shell 解释器占用,所以你的程序永远看不到它,而且你的代码(稍微)被破坏了,由于大括号放错了位置,缩进效果不佳。

    这是一个更正的版本:

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

    按预期工作:

    $ echo 'vinay\thunachyal\b' | ./escape
    vinay\thunachyal\b
    

    【讨论】:

    • 有什么办法可以避免shell吃掉退格而不生成单独的文件,我需要在退格键的运行时
    • 即使我的代码也可以工作如果我回显'vinay\thunachyal\b' | ./a.out,但我的查询是否有任何方法可以在程序的运行时检测退格,因为选项卡正在像退格一样工作@runtime,如果我错了,请纠正我。
    • @vinayhunachyal 是的,您的程序正在这样做。这里的问题只是如何让程序退格。如上所述使用echo 似乎是一种简单的方法。
    【解决方案2】:

    如果我没有误解问题,您可以使用“Ctrl-H”发送退格键。使用木马修正后的代码,当你输入:

    vinay^H
    

    它将打印:

    vinay\b
    

    ^H表示'Ctrl-H',是ASCII字符#8,也就是退格。

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2013-04-10
      • 1970-01-01
      相关资源
      最近更新 更多