UNE*_*ECS 2 c ncurses getch putchar
我一直试图getch在另一个程序中工作,但没有成功。所以我制作了最基本的程序,我可以使用getch我希望它在主程序中工作的方式。
我研究的需要noecho,cbreak,initscr和nodelay,我一直在使用也试过newscr(),但没有成功。
我遇到的问题是字符没有被打印到屏幕上,直到我点击“输入”,当它们put每个循环都应该出现在屏幕上时。为什么会这样?此外,光标不会在新行返回到屏幕左侧。例如。
abc
def
ghi
Run Code Online (Sandbox Code Playgroud)
我一直在寻找答案,但又被难住了......
#include <stdio.h>
#include <ncurses.h>
int main()
{
initscr();cbreak(); noecho();nodelay(stdscr,0);
char c ;
while((c=getch())!=EOF){
putchar(c);}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您没有看到输出,因为您的stdout流是行缓冲的。
您的程序正在正确处理单个字符;但输出流正在缓冲它们。
尝试fflush(stdout);或切换stdout到无缓冲模式setbuf(stdout, NULL);。
禁用缓冲的问题在于,当输出不是终端时,批量数据处理效率低下。
您可以以标准输出为 tty 为条件:
if (isatty(fileno(stdout))) /* #include <unistd.h> */
setbuf(stdout, NULL);
Run Code Online (Sandbox Code Playgroud)
要将光标返回到行首,您需要放一个回车符\r。这是因为curses 的cbreak模式禁用了ONLCRtty 模式(在输出上,当发送NL add CR 时)。
如果您无条件地添加\r,那么当您的输出被重定向时,它将出现在文件中。所以你又需要一些isatty技巧。
更好的方法可能是学习如何使用tcgetattr和tcsetattr函数来精确控制特定的 tty 参数,如果您只想在没有回显的情况下进行一次一个字符的输入,而不是实际开发基于交互式 curses 的程序。
你真的想要一次输入一个字符,还是只是为了禁用回声?禁用回声很容易。调用tcgetattr以struct termios使用文件描述符 0 的当前设置填充 a (如果它是 tty)。翻转一些标志以关闭回显,然后调用tcsetattr以安装更新的结构。当您的程序退出时,请保持良好状态并放回原始程序。完毕。