gpt4 book ai didi

c - getch 和 putchar 没有返回就无法工作

转载 作者:太空宇宙 更新时间:2023-11-04 00:53:37 24 4
gpt4 key购买 nike

我一直试图让 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); 或使用 setbuf(stdout, NULL); 将 stdout 切换到无缓冲模式;

禁用缓冲的问题在于,当输出不是终端时,它对批量数据处理效率低下。

您可以将标准输出作为 tty 的条件:

if (isatty(fileno(stdout)))  /* #include <unistd.h> */
setbuf(stdout, NULL);

要将光标返回到行首,您需要输入回车\r。这是因为 curses 的 cbreak 模式禁用了 ONLCR tty 模式(在输出上,发送 NL 时添加 CR)。

如果您无条件地添加\r,那么它会在您的输出被重定向时出现在文件中。因此,您再次需要一些 isatty hack。

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

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

关于c - getch 和 putchar 没有返回就无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10256477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com