我一直试图让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;
}
最佳答案
您没有看到输出,因为您的stdout
流是行缓冲的。
您的程序可以正确地获取各个字符;但是输出流正在缓冲它们。
尝试使用fflush(stdout);
将stdout
切换到无缓冲模式。
禁用缓冲的问题是,当输出不是终端时,对大容量数据处理效率低下。
您可以将标准输出设为tty作为条件:
if (isatty(fileno(stdout))) /* #include <unistd.h> */
setbuf(stdout, NULL);
要将光标返回到行的开头,需要输出回车
setbuf(stdout, NULL);
。这是因为curses'\r
模式禁用了cbreak
tty模式(在输出时,发送NL add CR)。如果无条件添加
ONLCR
,则在重定向输出时它将出现在文件中所以你还是需要一些技巧。更好的方法可能是学习如何使用
\r
和isatty
函数精确地控制特定的tty参数,如果您只想在不使用echo的情况下一次输入字符,而不是实际开发一个基于光标的交互式程序。你真的想一次输入一个字符,还是只想暗黑回音?很容易禁用echo调用
tcgetattr
用文件描述符0的当前设置(如果是tty)填充tcsetattr
。翻转一些标志以关闭回声,然后调用tcgetattr
以安装更新的结构当你的程序退出时,要友好些,把原来的那个放回原处。完成。关于c - getch和putchar不能不返回就不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10256477/