c - 当 ICANON 处于非规范模式时如何避免退格

标签 c echo termios

我按照我在上一个问题中提出的建议使用 termios,但现在我想问的是,是否有一种方法可以在非规范模式下使用 termios 的同时让退格键工作。我正在使用 termios 没有 echo 如果我使用 &=ECHO&=ICANON 这是我想要的结果,键盘一旦按键被按下并显示,输入就会被发送到 putchar() 但 '\b' 键显示为 hex,如果我做相反的事情我可以'在按下回车之前看不到文本,但 '\b' 有效。 我查了manual和其他一些论坛,他们说“不可能只是不要犯任何错误”,这很有意义,因为当我没有在 Ubuntu 的终端中正确输入密码时,我无法退格并更改它.但我确保我没有遗漏手册中的任何内容。

代码是从stdin获取输入,不显示空行。

#include <unistd.h>
#include <termios.h>
#include <errno.h>
#include <stdio.h>
#define ECHOFLAGS (ECHO)

int setecho(int fd, int onflag);
int first_line(int *ptrc);

int main(void){

struct termios old;
tcgetattr(STDIN_FILENO,&old);


setecho(STDIN_FILENO,0);
    int c;
    while((c = getchar())!= 4) //no end of file in non-canionical match to control D
        first_line(&c);
tcsetattr(STDIN_FILENO,&old);    
return 0;

    }


int setecho(int fd, int onflag){
    int error;
    struct termios term;

    if(tcgetattr(fd, &term) == -1)
        return -1;
    if(onflag){ printf("onflag\n");
        term.c_lflag &= ECHOFLAGS ; // I know the onflag is always set to 0 just 
        term.c_lflag &=ICANON;      // testing at this point
    }
    else{ printf("else\n");
        term.c_lflag &= ECHO;
        term.c_lflag &=ICANON;

    }

    while (((error = tcsetattr(fd, TCSAFLUSH, &term)) ==-1 && (errno == EINTR)))
            return error;
}

int first_line(int *ptrc){
    if (*ptrc != '\n' && *ptrc != '\r'){
            putchar(*ptrc);
        while (*ptrc != '\n'){
            *ptrc = getchar();
            putchar(*ptrc);
            }


    }
    else return 0;

    return 0;
}

谢谢拉克兰

P.S 在我的研究中,我注意到有人说 Termios 不是“标准 C”,这是因为它依赖于系统吗? (仅供评论)

最佳答案

您希望它如何运作?如果输入的字符被立即发送到您的程序,那么当接收到退格字符时,终端处理退格已经太晚了——您的程序已经看到前一个字符,因此它可以'被收回。

例如,假设用户按下 A。您的程序将收到 'A'来自 getchar()并处理它。现在用户按下 backspace - 现在终端应该做什么?

因此这意味着您可以在非规范模式下处理退格键的唯一地方是您的程序本身。当您收到 '\b'来自 getchar() 的字符,您可以对其进行特殊处理(就像对 '\n' 进行特殊处理一样)- 例如,从缓冲区中删除最近输入的字符。

关于c - 当 ICANON 处于非规范模式时如何避免退格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10274730/

相关文章:

c - 为什么我得到 "void value not ignored as it ought to be"?

c - wait(null) and wait(&status) C语言与状态

batch-file - 如何在 DOS 批处理中回显包含 '&' 的环境变量?

即使回声关闭也无法禁用转义回声

linux - 串口无响应

c - C 中后台子进程的无效命令

javascript - 如何在 PHP 中添加带有 JS 函数的输入标签

linux - 我可以同时输入变量和回显吗?

c - linux <termios.h> echo 及其含义

c++ - 具有相同变量名的不同结构