getch和putchar没有返回工作

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

我已经研究过对noechocbreakinitscrnodelay ,我也试过使用newscr()但没有成功。

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

 abc def ghi 

我找到了答案,但又被难倒……

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

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

你的程序可以让个人角色变得更好; 但输出流正在缓冲它们。

试试fflush(stdout); 或使用setbuf(stdout, NULL);stdout切换到无缓冲模式setbuf(stdout, NULL);

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

您可以使标准输出为tty:

 if (isatty(fileno(stdout))) /* #include  */ setbuf(stdout, NULL); 

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

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

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

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

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

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

几点建议:

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

 #include  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)看看如果你执行“refresh()”和/或删除“noecho()”会发生什么。

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

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