当stty在C中设置为原始模式时删除一个字符

时间:2017-09-13 14:51:41

标签: terminal tty

我试图获取包含换行符的文本段落,而无需用户每次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)也没有正确的字符。事实上,当我打印它时,它只打印最后一行。

1 个答案:

答案 0 :(得分:0)

您可以尝试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