gpt4 book ai didi

c - getch 和 putchar 无法正常工作且无返回

转载 作者:行者123 更新时间:2023-11-30 17:05:25 25 4
gpt4 key购买 nike

我一直在尝试让 getch 在另一个程序中工作,但没有成功。因此,我使用 getch 制作了最基本的程序,按照我希望它在主程序中工作的方式进行。

我研究了 noechocbreakinitscrnodelay 的需求,我也尝试过使用newscr() 但没有成功。

我遇到的问题是,直到我点击“输入”后,字符才会被打印到屏幕上,而每个循环都应该将它们放置到屏幕上。为什么会发生这种情况?此外,光标不会返回到新行处的屏幕左侧。例如。

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使用 setbuf(stdout, NULL); 进入无缓冲模式.

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

您可以将其设置为标准输出为 tty 的条件:

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

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

如果无条件添加\r ,那么当您的输出重定向时它将出现在文件中。所以你再次需要一些isatty黑客攻击。

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

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

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

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