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