13

我正在学习用 C 编程,并希望能够在我的代码运行时在终端中键入字符而无需按return. 我的程序有效,但是当我调用时initscr(),屏幕被清除了——即使在调用之后也是如此filter()。的文档filter建议它应该禁用清除 - 但是对我来说不是这种情况。

#include <stdio.h>
#include <curses.h>
#include <term.h>

int main(void) {

    int ch;

    filter();
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    while((ch = getch()) != EOF);

    endwin();

    return 0;
}

为什么上面的代码仍然使屏幕更清晰,可以做些什么来修复它?

如果有帮助,我正在使用 Debian Lenny(稳定)和 gnome-terminal。

4

4 回答 4

3

由于以下原因之一,您会在 curses 应用程序中看到您的屏幕被清除:

  • 您的程序调用initscr(清除屏幕)或newterm没有先调用filter,或
  • 终端初始化清除屏幕(或通过切换到备用屏幕使其看起来清除)。

在后一种情况下,您可以通过将enter_ca_modeexit_ca_mode指针重置为 NULL来抑制 ncurses 中的备用屏幕功能,dialog. 更好的是,选择一个可以满足您需求的终端描述。

进一步阅读:

于 2016-07-24T20:14:32.077 回答
2

通过 mike.dld 扩展答案,这适用于带有系统诅咒库的 MacOS X 10.6.6 (GCC 4.5.2) 上的我 - 无需清除屏幕。我添加了记录键入的字符(记录到文件“x”)的功能,以及键入CONTROL-D和停止程序而不是强迫用户中断的能力。

#include <stdio.h>
#include <curses.h>
#include <term.h>

#define CONTROL(x)  ((x) & 0x1F)

int main(void)
{
    FILE *fp = fopen("x", "w");
    if (fp == 0)
        return(-1);
    SCREEN *s = newterm(NULL, stdin, stdout);
    if (s == 0)
        return(-1);
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    int ch;
    while ((ch = getch()) != EOF && ch != CONTROL('d'))
        fprintf(fp, "%d\n", ch);

    endwin();

    return 0;
}
于 2011-01-23T04:42:57.367 回答
1

基本上,curses 旨在接管屏幕(或窗口,在窗口终端的情况下)。您不能真正将 curses 与 stdio 混合使用,也不能真正使用 curses 来输入或输出某些内容而不会弄乱屏幕的其余部分。有部分解决方法,但你永远无法真正让它按照你想要的方式工作。对不起。

我建议要么重写你的程序以在整个过程中使用诅咒,要么研究像 readline 这样的替代方案。

于 2014-03-01T23:44:00.890 回答
0

使用newterm()代替initscr(),你应该没问题。delscreen()如果您遵循此建议,请不要忘记。

于 2011-01-23T03:20:15.090 回答