簡體   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