我正在学习在C中编程,并希望能够在我的代码运行时将字符键入终端,而无需按下 返回. 。我的程序有效,但是当我打电话时 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末端。

有帮助吗?

解决方案

利用 newterm() 代替 initscr(), ,那你应该没事的。而且不要忘记 delscreen() 如果您遵循此建议。

其他提示

将Mike.dld的答案扩展到MacOS X 10.6.6(GCC 4.5.2)上,系统诅咒库库 - 无需清除屏幕。我添加了记录键入字符(记录到文件“ x”)的功能,并且能够键入 控制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;
}

由于以下原因之一,您会在诅咒申请中看到您的屏幕:

  • 您的程序打电话 initscr (清除屏幕)或 newterm 没有先打电话 filter, , 或者
  • 终端初始化可清除屏幕(或通过切换到备用屏幕清除)。

在后一种情况下,您可以通过重置ncurs中抑制替代屏幕功能 enter_ca_modeexit_ca_mode 指示为null 如完成 dialog. 。更好的是,选择一个可以执行您想要的终端描述。

进一步阅读:

基本上,诅咒被设计为接管屏幕(如果是窗户终端)。您无法真正将诅咒与STDIO混合在一起,也不能真正使用诅咒仅输入或输出某些内容而不弄乱其余的屏幕。有部分解决方法,但是您永远无法像听起来像您想要的那样使其正常工作。对不起。

我建议重写您的程序以在整个过程中使用诅咒,或者调查诸如Readline之类的替代方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top