以前の質問で提案されたように termios を使用していますが、非標準モードで termios を使用しているときにバックスペースを取得する方法があるかどうかを尋ねています。持っていないために termios を使用していますecho
私が使用&=ECHO
し、&=ICANON
これが私が望む結果である場合、キーが押されて表示されるとすぐにキーボード入力が putchar() に送信されますが、'\b'
キーは として表示されますhex
。 Enter キーを押すまでテキストが表示されませんが、'\b'
機能します。マニュアルを調べましたおよび彼らが「不可能であり、間違いを犯さないでください」と述べた他のいくつかのフォーラム、これは、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;
}
ありがとうラクラン
PS私の研究の側面で、Termiosは「標準C」ではないと誰かが言っているのに気づきました。これはシステムに依存しているためですか? (コメントのみ)