Tag: ncurses

为什么getch()没有读取输入的最后一个字符?

我正在使用ncurses库在C中编写一个蛇游戏,其中屏幕每秒更新一次。 当玩游戏的人知道,如果用户输入各种键或长按键,则不应存储“缓冲”按键。 换句话说,如果我按住w (向上键)并且stdin接收到20 w s的序列,然后输入d (右键),我希望蛇立即向右移动,并忽略缓冲w s。 我试图使用ncurses函数getch()实现这一点,但由于某种原因,我实现了我刚才描述的不良效果; 即在考虑最后一个按键之前,首先存储和处理任何长按键,因为这个MWE将说明: #include #include #include int main(){ char c = ‘a’; initscr(); cbreak(); noecho(); for(;;){ fflush(stdin); timeout(500); c = getch(); sleep(1); printw(“%c”, c); } return 0; } 有没有什么办法可以修改这段代码,以便getch()忽略任何缓冲的文本? 之前的fflush()似乎没有帮助。

如何在CodeBlocks中使用CDK库进行PdCurses?

我在CodeBlocks中成功安装并使用了PdCurses。 现在,当我正在尝试完成Ncurses教程时 ,我已经阅读了最后一部分说有一个实用程序库,它是CDK,它将通过提供pr-emade对话框来帮助简化curses应用程序。 我只是想问一下如何为PDCurses安装CDK库,因为它最初是为Ncurses安装的。 谢谢!!

如何在Linux中使用c的`getch`function?

我在Linux mint中安装了ncurses库,但我仍然不能在c中使用getch函数。 我正在使用Linux mint 18.2。 这是我的计划: #include #include int main() { char k; printf(“how are you”); k = getch(); printf(“%c”,k); } 这是输出: ram@ram$ gcc-7 test.c -lcurses ram@ram$ ./a.out how are you ram@ram$ 它不会等我按任何键并快速终止。 我不想为Linux安装conio.h 。 如何在Linux中使用getch和getche函数? 请不要告诉我自己的function。 我还是个菜鸟。 或者必须有替代品。

在循环中执行initscr()会导致错误初始化

我正在尝试制作一个简单的ncurses程序来显示带有消息的框。 我遵循这个链接 ,它运作良好。 我遇到的问题是,如果我将整个代码放在一个函数中并在循环中调用它,那么初始化就会出错。 据我所知,如果我在函数末尾调用endwin() ,那么再次调用initscr()应该没有任何问题。 我是否缺少一个能够再次调用initscr()的函数? 这是代码: #include #include #include #include int call() { WINDOW *mainwin, *childwin; int ch; if ((mainwin = initscr()) == NULL) { fprintf(stderr, “Error initialising ncurses.\n”); exit(EXIT_FAILURE); } noecho(); curs_set(FALSE); keypad(mainwin, TRUE); mvaddstr(childwin, 1, 6, “Warning! Press q to exit”); mvaddstr(childwin, 2, 15, “{ OK }”); refresh(); while( (ch = […]

C和ncurses中的结构数组

我正在尝试设置一个结构数组,最终将使用ncurses打印6个盒子。 第一个问题是我不知道如何设置结构数组,我的第二个问题是,我不知道我应该如何绘制框。 关于盒子的另一件事是它们必须使用“|”绘制 垂直墙的钥匙,我需要使用“ – ”水平的墙壁。 我尝试使用malloc内存来获取结构数组: room * roomInfo = malloc(sizeof(room) * 6); 房间是我的结构名称,roomInfo是我的结构数组。 我有三个错误。 一个是“错误:未知类型名称’房间’”,另一个是“错误:’房间’未声明(在此函数中首次使用)”(在我的文件顶部我有:“struct room roomInfo;”)和第三个是“注意:每个未声明的标识符仅针对它出现的每个函数报告一次” typedef struct { int roomNumber; int height; int width; int eastDoor; int westDoor; int southDoor; int northDoor; }room;

ncurses,print和contemporary获取字符串

用C编写的程序使用ncurses 。 while循环用于连续检查队列中是否有新消息到达:如果是,则消息将打印在屏幕上,然后从队列中删除: while (condition) { if (queue_not_empty) { printw(element_from_queue); refresh(); remove(element_from_queue); } } 但是,同时程序应该能够从用户获取输入字符串,然后通过scanw将其存储在数组char message[100] 。 但是,如果我把 while (condition) { if (queue_not_empty) { printw(element_from_queue); refresh(); remove(element_from_queue); } scanw(message); } 循环将停止,直到用户没有键入字符串,程序将仅在用户输入后打印队列的新消息。 它应该不是这样的! 队列消息可以随时到达,应该打印; 用户消息可以随时到达,并应存储到数组中。 我想避免创建另一个线程,因为ncurses对多个线程变得奇怪。 无论如何,我需要两个“当代”循环,一个用于打印消息,一个用于读取用户输入。 可能有解决方案吗? 换句话说:是否可以使用ncurses打印一些输出并从同一个屏幕中的同一个线程中的用户输入一些多个字符 ?

使用execlp()遇到麻烦

我使用execlp来实现基于网络的命令,但它不工作。我正在使用 execlp(“telnet 0 5000″,”telnet 0 5000″,(char *)NULL); delwin(menubar); delwin(messagebar); endwin(); 但它没有其他工作,如果我用ls替换telnet 0 5000它将工作,但输出来自相同的屏幕意味着在GUI和noecho得到自动激活和ls的输出以一种非常不寻常的方式。 下面是我的完整代码。 #include #include #include #define ENTER 10 #define ESCAPE 27 void init_curses() { initscr(); start_color(); init_pair(1,COLOR_WHITE,COLOR_ BLUE); init_pair(2,COLOR_BLUE,COLOR_WHITE); init_pair(3,COLOR_RED,COLOR_WHITE); curs_set(0); //noecho(); keypad(stdscr,TRUE); } void draw_menubar(WINDOW *menubar) { wbkgd(menubar,COLOR_PAIR(2)); waddstr(menubar,”PARALLEL”); wattron(menubar,COLOR_PAIR(3)); waddstr(menubar,”CON.”); wattroff(menubar,COLOR_PAIR(3)); wmove(menubar,0,20); waddstr(menubar,”SERIAL”); wattron(menubar,COLOR_PAIR(3)); waddstr(menubar,”CON.”); wattroff(menubar,COLOR_PAIR(3)); } WINDOW **draw_menu(int start_col) { […]

用ncurses和C ++输出一个漂亮的“块”字符?

我正在使用ncurses在c ++中编写一个控制台应用程序,我想输出一个可靠的ascii块。 它基本上会覆盖通常为普通字符的空白区域保留的所有区域。 是否存在我缺少的ASCII字符或者我在手册中没有看到的库函数?

Ncurses:面板的doupdate()和refresh()之间的区别

doupdate()和refresh()什么区别? 似乎refresh ()可以替换doupdate() ,但是除非调用refresh()否则不会出现文本。 另外, refresh()刷新所有窗口,还是应该为每个窗口调用refresh() ?

用ncurses处理转义序列? printf是否处理转义序列?

我的程序从网络读取一些文本数据,如: Hello \033[1;34mworld\033[0m and bla bla bla!!!\n” 。当程序使用prinf输出此字符串时,单词”world“为蓝色。但是当我使用带有wprintw或addch的ncurses接口时,我看到带有转义序列的原始字符串。这是否意味着printf处理转义序列与否?使用ncurses处理转义序列的最佳方法是什么?