如何从C语言中删除Linux终端中的字符

问题描述 投票:1回答:2

如何在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);
}

这只是展示这种技术的一个小例子。在原始程序中,我禁用了规范模式并自己处理每次击键。这就是我需要删除字符的原因。

写入退格键,空格,退格键在我的原始程序中运行良好。现在,当我在几年后运行相同的程序时,它没有删除任何东西。改变了什么?我该怎么做才能解决这个问题?

c linux terminal
2个回答
2
投票

正如我在comment中提到的,你需要使用backspace而不是'\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之后。


2
投票

正如Jonathan Leffler在评论中所解释的那样,您的代码需要进行两处修改:

  • 典型终端(仿真器)理解的rubout字符是'\b'(或8),而不是127。
  • 写入TTY时,printf()默认为行缓冲。这意味着你需要在调用fflush(stdout)printf()之间调用write()。没有刷新abc将只在程序出口处打印,因此删除序列将在它应该删除的内容之前发出,这使得它不起作用。
© www.soinside.com 2019 - 2024. All rights reserved.