[英]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。 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.