一个echo()引发的血案

Ariesbear posted @ 2009年8月24日 22:01 in Programming with tags c echo ncurses noecho , 201 阅读

最近几天正在赶C语言课程设计,原本曹老爷子是要求使用Turbo C使用图形函数设计界面,可我的本上已经装了Windows 7 & Ubuntu 9.04,无法正常运行Turbo C的图形程序。老爷子下了禁令,不准使用Windows API,不准使用GTK+、Qt等开发窗口界面,必须在终端下进行设计。我的任务是一个投资管理系统,数据结构很简单,就是一个十字链表,但图形界面可就麻烦了。老爷子说,这是让我们体会到在系统底层开发的痛苦。

向老爷子请教是否能在linux下用curses开发,得到了许可。于是我开始搜集有关方面的极其匮乏的资料,最后按照NCURSES Programming HOWTO和man文档开始了艰难跋涉。鼓捣了几天,搞出来一个简单丑陋的界面,还算能用了,但当我开始写有关的输入输出函数时,遇到麻烦了。

输入的字符无法显示,即使调用的是wgetstr()也没用。我天真的以为这是没有设置好窗口之间的关系,找不到解决方法,于是自力更生,艰苦奋斗,把输入的数据分成单个字符分别读入,在分别显示,至于删除函数则使用空格将被删除字符覆盖,显示出被“删除”的假象。折腾一番后,基本可以用了。

 

                mvwprintw(input_win, 2, 2, "请输入国家编号(3位数,按Enter结束):");
                mvwprintw(input_win, 2, 55, "                    ");
                for (i = 0; ; ++i) {
                        p->country_number[i] = wgetch(input_win);
                        if (p->country_number[i] != ENTER &&
                            p->country_number[i] != BACKSPACE) {
                                mvwprintw(input_win, 2, 55 + i, "%c", p->country_number[i]);
                                wrefresh(input_win);
                        }
                        else if (p->country_number[i] == ENTER) {
                                p->country_number[i + 1] = '\0';
                                break;
                        }
                        else if (p->country_number[i] == BACKSPACE) {
                                mvwprintw(input_win, 2, 54 + i, " ");
                                i -= 2;
                        }
                }
                mvwprintw(input_win, 11, 2, "                    ");
                mvwprintw(input_win, 11, 2, "%s", p->country_number);
                wrefresh(input_win);

 

 

 接下来我偶然在ncurses的手册上看到了关于noecho()和echo()的介绍,忽然想起写的初始化函数init_curses中有noecho(),当时没怎么注意,结果造成整个界面无法显示输入的字符。再次调用echo()就解决了问题。痛苦啊,我为此浪费了整个下午的时间的问题,就这样简单解决了。


登录 *


loading captcha image...
(输入验证码)