我正在使用我在上一个问题中建议的 termios ,但现在询问是否有办法让退格键在非规范模式下使用 termios 时工作。我正在使用 termios 没有echo
如果我使用&=ECHO
并且&=ICANON
这是我想要的结果,则键盘输入会在按下并显示键后立即发送到 putchar() 但如果我执行相反的操作,则'\b'
键显示为hex
在按下输入之前我看不到文本,但'\b'
可以。我查了说明书和其他一些论坛,他们说“不可能只是不要犯任何错误”,这是有道理的,因为当我在 Ubuntu 的终端中没有正确输入密码时,我无法退格并更改它. 但我确保我没有错过手册中的任何内容。
代码是从标准输入获取输入而不显示空行。
#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;
}
谢谢拉克兰
PS 在我的研究中,我注意到有人说 Termios 不是“标准 C”,这是因为它依赖于系统吗?(仅用于评论)