我一直试图让getch在另一个项目中工作,但没有成功。因此,我制作了最基本的程序,我可以使用getch的方式,我希望它在主程序中工作。
我研究了对noechocbreakinitscrnodelay的需求,我也尝试过使用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模式禁用了cbreaktty模式(在输出时,发送NL add CR)。
如果无条件添加ONLCR,则在重定向输出时它将出现在文件中所以你还是需要一些技巧。
更好的方法可能是学习如何使用\risatty函数精确地控制特定的tty参数,如果您只想在不使用echo的情况下一次输入字符,而不是实际开发一个基于光标的交互式程序。
你真的想一次输入一个字符,还是只想暗黑回音?很容易禁用echo调用tcgetattr用文件描述符0的当前设置(如果是tty)填充tcsetattr。翻转一些标志以关闭回声,然后调用tcgetattr以安装更新的结构当你的程序退出时,要友好些,把原来的那个放回原处。完成。

关于c - getch和putchar不能不返回就不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10256477/

10-12 00:43