バッファリングされていない/非標準モードでバックスペースを許可するには?

バッファリングされていない/非標準モードでバックスペースを許可するには?

私は、ECHOやICANONフラグなしで実行する必要があるシェルやテキストエディタなど、いくつかのCプログラムを開発しています。私はtermios.hを使用してこれらの機能を無効にし、返された文字列を自分のプログラムに渡し、エスケープされた文字に対して特別な操作を実行するインポート関数を直接作成しました。私ができない唯一のことは、バックスペースキーを印刷することです。たとえば、次のコードを使用すると:

void mgets(char *str)
{
    int c, i = 0;

    while((c = getchar()) != '\n')
        if(c == 27)
            // the user hit ESC, ignore it for now
        else if(c == '\b')
            puts("\b \b") // this is where it SHOULD backspace
        // else if it's a regular character:
        else {
            str+i = c; i++; // write that to the string...
            putchar(c); // ...and echo it to the screen
        }
}

すべては問題ありませんが、バックスペースを実行するとプログラムが応答しなくなります。 ifドアを少し変更すると...

if(c == '\b')
    printf("You hit a backspace!");

しかし、まだ反応はありません。私はput("\b \b")が動作することを知っているので、唯一の結論は私のバックスペースキーが '\b'として検出されないことです。どうですか?助けてください?よろしくお願いします!

ベストアンサー1

今後termios設定を変更すると救うそれらを。情報は、あなたが見るものと「同じ」です。stty -a

例えば

$ stty -a
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

後に表示される値erase「バックスペース」文字と呼ぶのです。システム規則に応じて、これは^H(8またはASCIIバックスペース)または^?(127またはASCII DEL)です。

たとえば、termios設定では

#include <termios.h>
...
struct termios data;
tcgetattr(0, &data);

それから

data.c_cc[VERASE]

それは同じです削除文字(データが設定されていない場合は警告が表示されます。stty「undef」が表示されます)。

他の設定とは異なり、削除文字は、端末が送信すると予想される内容を端末ドライバに通知する設定であるため、raw / cbreakモードにはまだ関係があります。設定が正しくない場合、stty両方の可能性をテストしても問題はありません。

追加資料:

おすすめ記事