关于 linux:如何使用 C 阻止退格键出现在 nCurses 中? | 珊瑚贝

How to stop backspace from appearing in nCurses using C?


我目前正在编写一个 ncurses shell,为了读取输入,逐个字符地读取它很重要,因此我使用的是 mvwgetch 命令。并在逐字符读取时递增计数器。问题是,每当我按下箭头键或退格键时,它们的输出就会被打印出来。因此,例如,如果我按退格键,则正在打印 ^?。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while ((command[i] = mvwgetch(promptwin, promptline, posx)) != \
) {
    if (command[i] == 7) { // if entered character is a backspace
        i =-2;
        posx =- 2;
        mvwdelch(promptwin, promptline, posx);
        mvwdelch(promptwin, promptline, posx 1);
        command[i] = \\0′;
    } else {
        posx++;
        posyx[1] = posx;
        wmove(promptwin, promptline, posx);
    }
    i++;
}

需要读取字符以跟踪光标在屏幕上的位置。在我的代码中,我尝试解决这个问题,但它仍然显示这些字符。 PS:在linux上工作。

  • 你是如何初始化你的 nCurses shell的?你在你的程序中使用 noecho 吗?你能分享更多的代码吗?这对我们来说有点帮助。如果您使用预定义的 maros 而不是键码的硬编码值,那就太好了:
  • 我应该上传什么部分?我没有使用 noecho 因为否则,它不会在 shell 上打印。
  • 实际上,我对自己调试您的代码很感兴趣。您可以共享发布此片段的文件。如果您不想在帖子中发送垃圾邮件,可以通过 pastebin 共享代码。
  • 唔。添加 mvwscanw(promptwin, promptline, posx,”%[^\
    ]”, command); 可以解决退格问题,但无法正确处理箭头键。
  • 问题是我想知道光标的位置,因为程序每秒更新一个单独的窗口,因此 x 坐标通过共享内存段传递,然后它被移回它离开的位置。


已解决

原来问题是退格的代码是 127。因此它没有被识别。为了处理退格,它现在执行以下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if(c == 127 || c == 8){                     //if character inserted is backspace or delete
                        if(posx != tcount) {
                            mvwprintw(promptwin, promptline, (posx + 1),“”);
                            mvwprintw(promptwin, promptline, posx,“”);
                            mvwprintw(promptwin, promptline, (posx 1),“”);
                            wmove(promptwin, promptline, (posx 2));
                            command[(chara 1)] = \\0′;
                            chara–;
                            posx–;
                            posyx[1] = posx;
                        } else {
                            mvwprintw(promptwin, promptline, (posx + 1),“”);
                            mvwprintw(promptwin, promptline, posx,“”);
                        }
                    } else {
                        command[chara] = c;
                        posx++;
                        posyx[1] = posx;
                        wmove(promptwin, promptline, posx);
                        chara++;
                    }

首先,7 不是退格键——7 是铃声。您想要 8。您还可以检查 KEY_BACKSPACE。

你提到不使用 noecho(),但这正是你必须做的来抑制特殊字符的输出。然后你可以明确地 addch() 你想要出现的那些(可打印的字符)。

  • 使用 noecho() 的问题是,我必须打印用户插入的每个字符。
  • 我不明白为什么这是个问题。


来源:https://www.codenong.com/43659660/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_8827.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?