繁体   English   中英

如何在C中从Linux终端中删除字符

[英]How to remove a character from a Linux terminal in C

在Linux中如何删除终端上光标之前的字符? 过去我使用过这样的东西:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define KEY_BACKSPACE 127

int main(){
    printf("%s", "abc"); // add something so we can see if delete works
    char * buf = malloc(3*sizeof(char));
    *(buf+0)=KEY_BACKSPACE;
    *(buf+1)=' ';
    *(buf+2)=KEY_BACKSPACE;
    write(1,buf,3);
    free(buf);
}

这只是一个演示此技术的小例子。 在原始程序中,我禁用了规范模式并自己处理了每个按键。 这就是为什么我需要删除字符。

在我的原始程序中编写退格,空格和退格效果很好。 现在,当我在几年后运行同一程序时,它没有删除任何内容。 发生了什么变化? 我该怎么做才能解决此问题?

正如乔纳森·莱夫勒(Jonathan Leffler)在评论中解释的那样,您的代码需要进行两项修改:

  • 典型终端(仿真器)可以理解的摩擦字符是'\\b' (或8),而不是127。
  • 写入TTY时,默认情况下, printf()是行缓冲的。 这意味着您需要在调用printf()write()之间调用fflush(stdout) write() 如果不刷新,则abc只会在程序退出时打印,因此删除序列将在应该删除的内容之前发出,从而使其无法工作。

正如我在评论中指出的那样,您需要使用退格键而不是'\\177' (或'\\x7F' )来向后移动。 您还必须担心标准I / O的缓冲。 通常最好不要在同一流上使用标准I / O和文件描述符I / O的混合体-在此示例中为标准输出。 使用一个或另一个,但不能两个都使用。

这有效:

#include <unistd.h>

int main(void)
{
    char buff1[] = "abc";
    char buff2[] = "\b \b";
    write(STDOUT_FILENO, buff1, sizeof(buff1) - 1);
    sleep(2);
    write(STDOUT_FILENO, buff2, sizeof(buff2) - 1);
    sleep(2);
    write(STDOUT_FILENO, "\n", 1);
    return 0;
}

首先显示(持续2秒):

abc

然后(再持续2秒钟):

ab

然后它退出。 光标首先在c之后,然后在b之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM