getch和putchar没有返回工作

时间:2012-04-21 05:26:28

标签: c ncurses getch putchar

我一直试图让getch在另一个程序中工作但没有成功。所以我已经使用getch以我希望它在主程序中工作的方式制作了最基本的程序。

我已经研究了对noechocbreakinitscrnodelay的需求,我也尝试使用newscr(),但没有成功。

我遇到的问题是,在我点击“输入”之前,字符不会被打印到屏幕上,而每次循环时它们应该put到屏幕上。为什么会这样?此外,光标不会返回到新行的屏幕左侧。例如

abc  
   def
      ghi

我已经找到了答案,但又被难过了......

#include <stdio.h>
#include <ncurses.h>

int main()
  {
     initscr();cbreak(); noecho();nodelay(stdscr,0);
    char c ;
    while((c=getch())!=EOF){
    putchar(c);}

    return 0;
  }

2 个答案:

答案 0 :(得分:4)

您没有看到输出,因为您的stdout流是行缓冲的。

你的程序可以让各个角色都正确;但是输出流正在缓冲它们。

尝试使用fflush(stdout); stdout或将setbuf(stdout, NULL);切换为无缓冲模式。

禁用缓冲的问题在于,当输出不是终端时,批量数据处理效率低。

您可以使标准输出为tty:

if (isatty(fileno(stdout)))  /* #include <unistd.h> */
  setbuf(stdout, NULL);

要将光标返回到行的开头,您需要输出回车\r。这是因为curses的cbreak模式已禁用ONLCR tty模式(在输出时发送NL add CR)。

如果您无条件地添加\r,则在重定向输出时它将显示在文件中。所以你需要一些isatty黑客。

更好的方法是学习如何使用tcgetattrtcsetattr函数来精确控制特定的tty参数,如果你想要的只是在没有回声的情况下进行一次一个字符的输入,而不是实际开发基于诅咒的交互式程序。

你真的想要一次一个字符输入,还是只想要回音?禁用回声很容易。调用tcgetattr以使用文件描述符0的当前设置填充struct termios(如果它是tty)。翻转一些标志以关闭回显,然后调用tcsetattr以安装更新的结构。当你的程序退出时,请保持良好并放回原来的程序。完成。

答案 1 :(得分:2)

是的,ncurses是逐个字符控制的好方法。

是的,你必须调用“initscr()”和“cbreak()”。

SUGGESTIONS:

1)将您的代码与此ncurses“hello world”进行比较:

#include <ncurses.h>

int main()
{   
    initscr();          /* Start curses mode          */
    printw("Hello World !!!");  /* Print Hello World          */
    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */

    return 0;
}

2)看看如果你做“刷新()”和/或删除“noecho()”会发生什么。

3)本教程有很多可能也有帮助的好信息:

http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/