getch 和 putchar 没有返回就不能工作

UNE*_*ECS 2 c ncurses getch putchar

我一直试图getch在另一个程序中工作,但没有成功。所以我制作了最基本的程序,我可以使用getch我希望它在主程序中工作的方式。

我研究的需要noechocbreakinitscrnodelay,我一直在使用也试过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)

Kaz*_*Kaz 6

您没有看到输出,因为您的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技巧。

更好的方法可能是学习如何使用tcgetattrtcsetattr函数来精确控制特定的 tty 参数,如果您只想在没有回显的情况下进行一次一个字符的输入,而不是实际开发基于交互式 curses 的程序。

你真的想要一次输入一个字符,还是只是为了禁用回声?禁用回声很容易。调用tcgetattrstruct termios使用文件描述符 0 的当前设置填充 a (如果它是 tty)。翻转一些标志以关闭回显,然后调用tcsetattr以安装更新的结构。当您的程序退出时,请保持良好状态并放回原始程序。完毕。