NCURSES-在tty模式下打印新行时打印错误

NCURSES-在tty模式下打印新行时打印错误,c,ncurses,C,Ncurses,我有这个计划: #include <ncurses.h> SCREEN * sstderr; SCREEN * sstdout; int main() { sstderr = newterm(NULL, stderr, NULL); noecho(); sstdout = newterm(NULL, stdout, stdin); set_term(sstdout); addstr("PRESS A KEY"); getch();

我有这个计划:

#include <ncurses.h>

SCREEN * sstderr;
SCREEN * sstdout;

int main() {
    sstderr = newterm(NULL, stderr, NULL);
    noecho();
    sstdout = newterm(NULL, stdout, stdin);
    set_term(sstdout);

    addstr("PRESS A KEY");
    getch();
    def_prog_mode();
    endwin();

    system("ls -l");

    getchar();
    reset_prog_mode();
    refresh();
    addstr("Press another key");
    getch();
    set_term(sstdout);
    endwin();
    set_term(sstderr);
    endwin();
}
我尝试在
initscr()
行之前使用def_shell_mode()(在我的例子中是newterm()),并在
系统(“ls-l”)之前重置_shell_mode()但问题仍然存在。
我唯一能解决这个问题的方法就是使用

system("reset");
就在
系统(“ls-l”)之前

有人知道真正的问题是什么,我如何在没有“重置”呼叫的情况下修复它吗


谢谢

您的程序将同一终端初始化为curses模式两次。但它第一次将终端设置为原始模式,从烹调模式开始。第二次它已经处于原始模式。这些是独立的流并不重要,但它们连接到同一个终端驱动程序

初始化第二个屏幕(用于标准输出),然后执行“还原”,由于还原到原始模式,因此不会发生任何事情


在执行
endwin
之前,您可以通过切换回标准错误屏幕来“修复”它。顺便说一句,将shell模式终端设置从一个屏幕复制到另一个屏幕时会遇到问题。

除了注意到您正在使用getchar(不是curses函数)之外,包含该片段的简单程序会按预期工作。也许一个更完整的例子会有所帮助。此外,如果您使用Cygwin,它因楼梯问题而臭名昭著。是的,我确实在那里使用getchar,因为我假设我脱离了curses模式(在tty模式下,直到reset_prog_mode()指令)…将程序源代码更新为一个完整的程序,显示了所描述的行为..我不熟悉挂起/恢复ncurses,但是我怀疑
ls
的输出大小是针对ncurses字符和终端宽度的,这会导致行的长度超过终端在“tty”模式下显示的长度,并且随后会将每行的末端包裹起来,这被视为与后续每行的水平位移。(这只是一个有根据的猜测,我怀疑这与正在发生的事情很接近)
system("reset");