我按照我在上一个问题中提出的建议使用 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/