如何在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);
}
这只是展示这种技术的一个小例子。在原始程序中,我禁用了规范模式并自己处理每次击键。这就是我需要删除字符的原因。
写入退格键,空格,退格键在我的原始程序中运行良好。现在,当我在几年后运行相同的程序时,它没有删除任何东西。改变了什么?我该怎么做才能解决这个问题?
正如我在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
之后。
正如Jonathan Leffler在评论中所解释的那样,您的代码需要进行两处修改:
'\b'
(或8),而不是127。printf()
默认为行缓冲。这意味着你需要在调用fflush(stdout)
和printf()
之间调用write()
。没有刷新abc
将只在程序出口处打印,因此删除序列将在它应该删除的内容之前发出,这使得它不起作用。