getch和putchar没有返回工作
我一直试图让getch
在另一个程序中工作但没有成功。 所以我已经制作了最基本的程序,我可以使用getch
,就像我希望它在主程序中工作一样。
我已经研究过对noecho
, cbreak
, initscr
和nodelay
,我也试过使用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。
更好的方法是学习如何使用tcgetattr
和tcsetattr
函数来精确控制特定的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)本教程有很多可能也有帮助的好信息: