【问题标题】:Erase a character when stty is set to raw mode in C在 C 中将 stty 设置为原始模式时擦除字符
【发布时间】:2018-02-22 08:24:41
【问题描述】:

我试图获取包含换行符的一段文本,而用户无需在每次 getch 时按 Enter 键,直到用户按 CTRL+C 时,下面显示的循环将退出。但是使用这种方法的问题在于,一旦终端设置为原始模式,当我按 Enter 时它也会显示那些 ^M,当我按 backspace 时显示^?。如何解决这个问题?我也试过给system("/bin/stty raw -echo isig");但是这个方法也没有用(我输入时没有字符显示)

int main(void)
{
    char str[1000] ,c , i=0 ;

    system("/bin/stty raw") ;
    while(1)
    {
        c = getchar();
        str[i++] = c ;
        if(c==3)break;
        if(c==13)puts("\r");
    }

    system("/bin/stty cooked") ;

    for(i=0 ;str[i] ; i++) printf("%c",str[i]) ;
}

最后产生的字符串 (str) 也没有正确的字符。事实上,当我打印它时,它只打印最后一行。

【问题讨论】:

  • 为什么不用putc(str[i]) 而不是printf("%c",str[i])
  • 你不能一边吃蛋糕一边吃。如果你想要生的,你得到它。问题是如果你不想要原始模式,为什么要使用它。
  • 因为我不希望它等到用户在输入每个字符后按回车键才能对其进行处理。在原始模式下,只要我按下任何字符,它就会接受该字符,而不是等到按下回车键。

标签: terminal tty


【解决方案1】:

您可以尝试printf("\b \b"); 来擦除一个字符,但首先您必须检查是否按下了backspace,您需要在您的特定机器上找出backspace 的代码:

if (ch == 0x7F)         // the code for backspace on my machine
    printf("\b \b");    // simulate erasing a character using two '\b' and a space ' '

您也可以使用VT100 escape codes:

if (ch == 0x7F)         // the code for backspace on my machine
    printf("\b\33[K");  // clear line from cursor right

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多