免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5390 | 回复: 19
打印 上一主题 下一主题

用curses写的通用菜单修改后的正确程序! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-24 07:11 |只看该作者 |倒序浏览
总看到有人发帖子问那个通用菜单程序中的几个错误不能编译的事,回去找了一下我修改后可以正常工作的程序,现贴出来,大家共享一下吧。
我的系统是scounix的。
编译  cc menu.c -o menu -lcurses
  1. /*****************************************************************
  2. 本程序需要借肋两个参数文件来实现:
  3. (1)、对菜单中每一项参数进行说明的文件(menu.def),它格式如下所述:
  4. !所属菜单代号!项顺序号!菜单项名称!外挂程序名称!下级菜单代号!
  5. 说明:
  6. 1、如菜单代号为"0",则表示此项属于主菜单;
  7. 2、如外挂程序名称为"0",则表示此菜单项对应的过程在菜单程序内部或对应于一个子菜单;
  8. 3、如下级菜单代号为"0",则表示此菜单项无下级子菜单;
  9. 4、项顺序号同时可作为菜单热键使用。
  10. 假如文件menu.def中有下面这一行:
  11. !0!3!格式化磁盘!format /dev/rfd0135ds18!0!
  12. 它表示主菜单的第三项为格式化磁盘,它对应的执行过程为 format /dev/rfd0135ds18,本项无子菜单。
  13. 如果用户想把自己编的实现查询功能程序XXX挂到本程序主菜单第4项上,则可在menu.def中增加下面
  14. 这一行:
  15. !0!4!查询!XXX!0!
  16. (2)、对各菜单参数进行说明文件(menu.conf),其格式如下所述:
  17. !菜单代号!上一级菜单代号!边框标志!菜单宽度!菜单行数!菜单列数!起始横坐标!起始纵坐标!
  18. 说明:
  19. 1、边框标志为"0"表示无框,为"1"表示有边框;
  20. 2、上级菜单代号为"-1",表示无上级菜单;
  21. 3、如菜单代号为"0",表示主菜单。
  22. 当用户对菜单显示样式不满意时,可通过调整此文件设计个性化的界面
  23. ****************************************************************/
  24. #include <curses.h>;
  25. #include <stdlib.h>;
  26. #define ESC 27  
  27. #define ENT 13  
  28. #define REFRESH 12  
  29. #define MAX_M 10 /* 菜单最大层数 */  

  30. void initial(),nomlastpos(),revcurpos(),disponepage(),dispprevline();
  31. void dispnextline(),domenu(),getmenuconf(),keycont();
  32. void getitem(), get_m_conf(), get_m_item(),clearwin(),execprog();
  33. /* 标识每一菜单项的结构 */
  34. struct menu {
  35.         short menu_code; /* 所属菜单代号 */

  36.         short item_order; /* 项顺序号 */

  37.         char item[20]; /* 菜单项名称 */

  38.         char prog[80]; /* 本项菜单执行程序 */

  39.         short submenu_code; /* 下一级菜单编号 */

  40.         struct menu *next; /* 指向上一项的指针 */

  41.         struct menu *prev; /* 指向下一项的指针 */

  42. } m_item,*head,*this,*new,*last,*scrpos,*lastscrpos,*begin,*lastbegin,*lastscr[MAX_M];
  43. /* 标识每一菜单内容的结构 */
  44. struct menuconf {
  45.         short menu_code; /* 菜单代号 */

  46.         short last_code; /* 上一级菜单代号 */

  47.         short bord_flag; /* 边框标志 0--无边框 1--有边框 **/

  48.         short m_wight; /* 菜单显示宽度 */

  49.         short m_lengh; /* 每一行项数 */

  50.         short m_col; /* 菜单列数 */

  51.         short m_bx; /* 菜单起始横坐标 */

  52.         short m_by; /* 菜单起始纵坐标 */

  53. } m_conf;
  54. WINDOW *menuwin, *boxwin, *curw, *lastw[MAX_M], *workwin;
  55. long curpos, lastcurpos, lastscrcurpos, lastmenucur[MAX_M];
  56. short menu_no = 0, wno = 0;

  57. main()
  58. {
  59.         initial();
  60.         getmenuconf(0); /* 取第0号菜单参数 */


  61.         /* 创建主窗口 */
  62.         menuwin=newwin(m_conf.m_lengh, m_conf.m_wight, m_conf.m_bx+1, m_conf.m_by+1);
  63.         curw=menuwin;
  64.         lastw[wno]=menuwin;

  65.         getitem(); /* 取当前菜单各项内容 */

  66.         domenu(head, 0);
  67.         endwin();
  68. }
  69. /* 取菜单各项参数函数 */
  70. void getitem()
  71. {
  72.         FILE *fp;
  73.         char buff[0x100];

  74.         /* 建边框窗口 */
  75.         boxwin=newwin(m_conf.m_lengh+2,m_conf.m_wight+2,m_conf.m_bx,m_conf.m_by);
  76.         keypad(curw, TRUE);
  77.         if (m_conf.bord_flag==1) {
  78.                 box(boxwin, 0,0 );
  79.                 wrefresh(boxwin);
  80.         }

  81.         head=NULL;
  82.         if ((fp = fopen("menu.def","r")) == NULL) {
  83.                 printw( "\n不能打开菜单定义文件\n");
  84.                 refresh();
  85.                 endwin();
  86.                 exit(-1);
  87.         }
  88.         while( fgets(buff, 0x100, fp)!=NULL) {
  89.                 get_m_item(buff);

  90.                 if (m_item.menu_code != menu_no)
  91.                         continue;

  92.                 new=(struct menu*)malloc(sizeof(struct menu));
  93.                 if (head == NULL) {
  94.                         last = head;
  95.                         head = new;
  96.                 }
  97.                 else {
  98.                         this->;next = new;
  99.                         last = this;
  100.                 }
  101.                 this = new;
  102.                 this->;menu_code=m_item.menu_code;
  103.                 this->;item_order=m_item.item_order;
  104.                 strcpy(this->;item,m_item.item);
  105.                 strcpy(this->;prog,m_item.prog);
  106.                 this->;submenu_code=m_item.submenu_code;
  107.                 this->;next=NULL;
  108.                 this->;prev = last;
  109.         }
  110.         fclose(fp);
  111. }
  112. /* 菜单处理函数 */
  113. void domenu(curscrp, curp)
  114. struct menu *curscrp;
  115. int curp;
  116. {
  117.         int i, x, y;
  118.         struct menu *mpos;
  119.         int  ch;

  120.         this = head;
  121.         disponepage(this);
  122.         curpos = curp;
  123.         scrpos = curscrp;
  124.         lastcurpos = lastscrcurpos = 0;
  125.         revcurpos();
  126.         for(;;) {
  127.         ch=wgetch(curw);
  128.                 switch (ch) {
  129.                 case ENT:
  130.                         /* 有下一级菜单 */
  131.                         if ((!strcmp(scrpos->;prog, "0")) && (scrpos->;submenu_code != 0)) {
  132.                                 lastbegin = begin->;next;
  133.                                 getmenuconf(scrpos->;submenu_code);
  134.                                 menu_no = scrpos->;submenu_code;

  135.                                 wno++;
  136.                                 lastmenucur[wno]=curpos;
  137.                                 lastscr[wno] = scrpos;
  138.                                 lastw[wno]=curw;

  139.                                 workwin=newwin(m_conf.m_lengh,m_conf.m_wight,m_conf.m_bx+1,m_conf.m_by+1);
  140.                                 curw=workwin;
  141.                                 getitem();
  142.                                 domenu(head, 0);
  143.                         }
  144.                         /* 是内部函数 */
  145.                         /* 是外部可执行程序 */
  146.                         else {
  147.                                 endwin();
  148.                                 execprog();
  149.                         }
  150.                         break;
  151.                 case ESC:
  152.                 case 'q':
  153.                 case 'Q':
  154.                 case '0':
  155.                         /* 无上级菜单 */
  156.                         if (m_conf.last_code == -1) {
  157.                                 clearwin();
  158.                                 endwin();
  159.                                 exit(0);
  160.                         }
  161.                         /* 有上级菜单 */
  162.                         else {
  163.                                 menu_no = m_conf.last_code;
  164.                                 clearwin();
  165.                                 getmenuconf(menu_no);
  166.                                 getitem();
  167.                                 touchwin(lastw[wno]);
  168.                                 curw=lastw[wno];
  169.                                 curpos = lastmenucur[wno];
  170.                                 scrpos = lastscr[wno];
  171.                                 wno--;
  172.                                 wrefresh(curw);
  173.                         }
  174.                         break;
  175.                 case 'r':
  176.                 case 'R':
  177.                 case REFRESH: /* 重显屏幕 */

  178.                         wrefresh(curscr);
  179.                         break;
  180.                 case KEY_RIGHT: /* 右光标键 */

  181.                         if ( scrpos->;next != NULL ) {
  182.                                 lastcurpos = curpos;
  183.                                 lastscrpos = scrpos;
  184.                                 scrpos=scrpos->;next;
  185.                                 getyx(curw, x, y);
  186.                                 if((x==m_conf.m_lengh-1)&&(curpos%m_conf.m_col==m_conf.m_col-1)){
  187.                                         curpos-=(m_conf.m_col-1);
  188.                                         lastcurpos = curpos - 1;
  189.                                         /* 实现向上卷屏 */
  190.                                         wmove(curw, 0, 0);
  191.                                         wdeleteln(curw);
  192.                                         dispnextline("R");
  193.                                 }
  194.                                 else
  195.                                         curpos++;
  196.                                 if ((curpos%m_conf.m_col == 0) && (m_conf.m_lengh == 1)) {
  197.                                         revcurpos();
  198.                                         break;
  199.                                 }
  200.                                 else {
  201.                                         nomlastpos();
  202.                                         revcurpos();
  203.                                 }
  204.                         }
  205.                         break;
  206.                 case KEY_LEFT: /* 左光标键 */

  207.                         if ( scrpos->;prev != NULL ) {
  208.                                 lastcurpos = curpos;
  209.                                 lastscrpos = scrpos;
  210.                                 scrpos=scrpos->;prev;
  211.                                 getyx(curw, x, y);
  212.                                 if ((x==0) && (curpos%m_conf.m_col ==0)) {
  213.                                         curpos+=m_conf.m_col-1;
  214.                                         lastcurpos = curpos + 1;
  215.                                         /* 实现向下卷屏 */
  216.                                         winsertln(curw);
  217.                                         dispprevline("L");
  218.                                 }
  219.                                 else
  220.                                         curpos--;
  221.                                 if ((curpos%m_conf.m_col==m_conf.m_col-1)&&(m_conf.m_lengh==1)) {
  222.                                         revcurpos();
  223.                                         break;
  224.                                 }
  225.                                 else {
  226.                                         nomlastpos();
  227.                                         revcurpos();
  228.                                 }
  229.                         }
  230.                         break;
  231.                 case KEY_UP: /* 上光标键 */

  232.                         lastcurpos = curpos;
  233.                         lastscrpos = scrpos;
  234.                         mpos = scrpos;
  235.                         for(i=0;i < m_conf.m_col;i++){
  236.                                 if ( mpos->;prev != NULL ) mpos=mpos->;prev;
  237.                                 else break;
  238.                         }
  239.                         if ( i==m_conf.m_col ) {
  240.                                 getyx(curw, x, y);
  241.                                 if (x==0) {
  242.                                         lastcurpos += m_conf.m_col;
  243.                                         /* 实现向下卷屏 */
  244.                                         winsertln(curw);
  245.                                         dispprevline("U");
  246.                                 }
  247.                                 else {
  248.                                         curpos-=m_conf.m_col;
  249.                                 }
  250.                                 scrpos = mpos;
  251.                                 if ( m_conf.m_lengh!=1)
  252.                                         nomlastpos();
  253.                                 revcurpos();
  254.                         }
  255.                         break;
  256.                 case KEY_DOWN: /* 下光标键 */

  257.                         lastcurpos = curpos;
  258.                         lastscrpos = scrpos;
  259.                         mpos = scrpos;
  260.                         for(i=0;i < m_conf.m_col;i++){
  261.                                 if ( mpos->;next != NULL )
  262.                                         mpos=mpos->;next;
  263.                                 else
  264.                                         break;
  265.                         }
  266.                         if ( i==m_conf.m_col ) {
  267.                                 getyx(curw, x, y);
  268.                                 if (x==m_conf.m_lengh-1) {
  269.                                         lastcurpos -= m_conf.m_col;
  270.                                         /* 实现向上卷屏 */
  271.                                         wmove(curw, 0, 0);
  272.                                         wdeleteln(curw);
  273.                                         dispnextline("D");
  274.                                 }
  275.                                 else
  276.                                         curpos+=m_conf.m_col;
  277.                                 scrpos = mpos;
  278.                                 if ( m_conf.m_lengh!=1)
  279.                                         nomlastpos();
  280.                                 revcurpos();
  281.                         }
  282.                         break;
  283.                 default:
  284.                         beep();
  285.                         break;
  286.                 }
  287.         }
  288. }
  289. /* 反显当前项函数 */
  290. void revcurpos()
  291. {
  292.         wattrset(curw, A_STANDOUT);
  293.         wmove(curw, curpos/m_conf.m_col,  
  294.             (curpos%m_conf.m_col)*m_conf.m_wight/m_conf.m_col+m_conf.m_col);
  295.         wprintw(curw, "%s", scrpos->;item);
  296.         wattrset(curw, A_NORMAL);
  297.         wrefresh(boxwin);
  298. }
  299. /* 正常显示上一项函数 */
  300. void nomlastpos() {
  301.         wmove(curw, lastcurpos/m_conf.m_col, (lastcurpos%m_conf.m_col)
  302.             *m_conf.m_wight/m_conf.m_col+m_conf.m_col);
  303.         wprintw(curw, "%s", lastscrpos->;item);
  304. }
  305. /* 显示一页函数 */
  306. void disponepage(first)
  307. struct menu *first;
  308. {
  309.         short col, row;

  310.         begin=first; /* begin 为本页首指针 */
  311.         for(row=0; row<m_conf.m_lengh;row++){
  312.                 for(col=0; col<m_conf.m_col;col++){
  313.                         /* m_conf.m_wight/m_col为每一菜单项应占字符数*/
  314.                         wmove(curw,row,col*m_conf.m_wight/m_conf.m_col+m_conf.m_col);
  315.                         wprintw(curw, "%s", first->;item);
  316.                         wrefresh(curw);
  317.                         last = first;
  318.                         first = first->;next;
  319.                         if (first == NULL) {
  320.                                 break;
  321.                         }
  322.                 }
  323.         }
  324. }
  325. /* 显示上一行函数 */
  326. void dispprevline(flag)
  327. char flag[2]; /* L-左光标引起 U-上光标引起 */
  328. {
  329.         struct menu *tmppos;
  330.         int tmpcurpos;

  331.         tmpcurpos = curpos;
  332.         tmppos = scrpos;
  333.         if ( flag[0] == 'U') {
  334.                 while ( tmpcurpos % m_conf.m_col != 0) {
  335.                         tmppos = tmppos->;prev;
  336.                         tmpcurpos--;
  337.                 }
  338.                 tmppos = tmppos->;prev;
  339.         }
  340.         for (tmpcurpos = m_conf.m_col-1; tmpcurpos >;= 0; tmpcurpos--) {
  341.                 wmove(curw, 0, (tmpcurpos%m_conf.m_col)*m_conf.m_wight/m_conf.m_col+m_conf.m_col);
  342.                 wprintw(curw, "%s", tmppos->;item);
  343.                 begin = tmppos; /*begin 为本页首指针*/
  344.                 last = tmppos;
  345.                 tmppos = tmppos->;prev;
  346.                 if (tmppos == NULL)
  347.                         break;
  348.         }
  349.         wrefresh(curw);
  350. }
  351. /* 显示下一行函数 */
  352. void dispnextline(flag)
  353. char flag[2];/* R-右光标引起 D-下光标引起 */
  354. {
  355.         struct menu *tmppos;
  356.         int tmpcurpos;

  357.         tmpcurpos = curpos;
  358.         tmppos = scrpos;
  359.         if ( flag[0] == 'D') {
  360.                 while ( tmpcurpos % m_conf.m_col != m_conf.m_col-1) {
  361.                         tmppos = tmppos->;next;
  362.                         tmpcurpos++;
  363.                 }
  364.                 tmppos = tmppos->;next;
  365.         }

  366.         for (tmpcurpos = 0; tmpcurpos < m_conf.m_col; tmpcurpos++) {
  367.                 wmove(curw, m_conf.m_lengh-1, (tmpcurpos%m_conf.m_col)*m_conf.m_wight/m_conf.m_col+m_conf.m_col);
  368.                 wprintw(curw, "%s", tmppos->;item);
  369.                 last=tmppos;/* last 为本页最后一个结点指针 */
  370.                 begin=tmppos;
  371.                 tmppos = tmppos->;next;
  372.                 if (tmppos == NULL)
  373.                         break;
  374.         }
  375. }
  376. /* 取指定菜单参数函数 */
  377. void getmenuconf(menu_code)
  378. short menu_code;
  379. {
  380.         FILE *fp;
  381.         char menu_buff[0x100];

  382.         if ((fp = fopen("menu.conf", "r"))==NULL) {
  383.                 printw( "can not open menu config file");
  384.                 refresh();
  385.                 endwin();
  386.                 exit(-1);
  387.         }
  388.         while( fgets(menu_buff, 0x100, fp)!=NULL ) {
  389.                 get_m_conf(menu_buff);
  390.                 if (m_conf.menu_code == menu_code)
  391.                         break;
  392.         }
  393.         return ;
  394. }
  395. /* 取指定菜单参数处理函数 */
  396. void get_m_conf(menu_conf)
  397. char *menu_conf;
  398. {
  399.         register i, j, k;
  400.         char buff[20];

  401.         j = k = 0;
  402.         for (i = 0; i < strlen(menu_conf); i++) {
  403.                 if ( menu_conf[i] == '!' ) {
  404.                         j++;
  405.                         if ( j == 1) {
  406.                                 k = i+1;
  407.                                 continue;
  408.                         }
  409.                         switch(j) {
  410.                         case 2:
  411.                                 memcpy(buff, &menu_conf[k], i-k);
  412.                                 buff[i-k]=0;
  413.                                 m_conf.menu_code = atoi(buff);
  414.                                 k=i+1;
  415.                                 break;
  416.                         case 3:
  417.                                 memcpy(buff, &menu_conf[k], i-k);
  418.                                 buff[i-k]=0;
  419.                                 m_conf.last_code = atoi(buff);
  420.                                 k=i+1;
  421.                                 break;
  422.                         case 4:
  423.                                 memcpy(buff, &menu_conf[k], i-k);
  424.                                 buff[i-k]=0;
  425.                                 m_conf.bord_flag = atoi(buff);
  426.                                 k=i+1;
  427.                                 break;
  428.                         case 5:
  429.                                 memcpy(buff, &menu_conf[k], i-k);
  430.                                 buff[i-k]=0;
  431.                                 m_conf.m_wight = atoi(buff);
  432.                                 k=i+1;
  433.                                 break;
  434.                         case 6:
  435.                                 memcpy(buff, &menu_conf[k], i-k);
  436.                                 buff[i-k]=0;
  437.                                 m_conf.m_lengh = atoi(buff);
  438.                                 k=i+1;
  439.                                 break;
  440.                         case 7:
  441.                                 memcpy(buff, &menu_conf[k], i-k);
  442.                                 buff[i-k]=0;
  443.                                 m_conf.m_col = atoi(buff);
  444.                                 k=i+1;
  445.                                 break;
  446.                         case 8:
  447.                                 memcpy(buff, &menu_conf[k], i-k);
  448.                                 buff[i-k]=0;
  449.                                 m_conf.m_bx = atoi(buff);
  450.                                 k=i+1;
  451.                                 break;
  452.                         case 9:
  453.                                 memcpy(buff, &menu_conf[k], i-k);
  454.                                 buff[i-k]=0;
  455.                                 m_conf.m_by = atoi(buff);
  456.                                 k=i+1;
  457.                                 break;
  458.                         default:
  459.                                 break;
  460.                         }
  461.                 }
  462.         }
  463. }
  464. /* 取指定项参数处理函数 */
  465. void get_m_item(menu_item)
  466. char *menu_item;
  467. {
  468.         register i, j, k;
  469.         char buff[80];

  470.         j = k = 0;
  471.         for (i = 0; i < strlen(menu_item); i++) {
  472.                 if ( menu_item[i] == '!' ) {
  473.                         j++;
  474.                         if ( j == 1) {
  475.                                 k = i+1;
  476.                                 continue;
  477.                         }
  478.                         switch(j) {
  479.                         case 2:
  480.                                 memcpy(buff, &menu_item[k], i-k);
  481.                                 buff[i-k] = 0;
  482.                                 m_item.menu_code = atoi(buff);
  483.                                 k=i+1;
  484.                                 break;
  485.                         case 3:
  486.                                 memcpy(buff, &menu_item[k], i-k);
  487.                                 buff[i-k] = 0;
  488.                                 m_item.item_order = atoi(buff);
  489.                                 k=i+1;
  490.                                 break;
  491.                         case 4:
  492.                                 memcpy(buff, &menu_item[k], i-k);
  493.                                 buff[i-k] = 0;
  494.                                 strcpy(m_item.item,buff);
  495.                                 k=i+1;
  496.                                 break;
  497.                         case 5:
  498.                                 memcpy(buff, &menu_item[k], i-k);
  499.                                 buff[i-k] = 0;
  500.                                 strcpy(m_item.prog,buff);
  501.                                 k=i+1;
  502.                                 break;
  503.                         case 6:
  504.                                 memcpy(buff, &menu_item[k], i-k);
  505.                                 buff[i-k] = 0;
  506.                                 m_item.submenu_code = atoi(buff);
  507.                                 k=i+1;
  508.                                 break;
  509.                         default:
  510.                                 break;
  511.                         }
  512.                 }
  513.         }
  514. }
  515. /* 初始化资源*/
  516. void initial() /* 自定开启 curses 函式 */  
  517. {
  518.         initscr();
  519.         cbreak();
  520.         nonl();
  521.         noecho();
  522.         intrflush(stdscr,FALSE);
  523.         keypad(stdscr,TRUE);
  524.         refresh();
  525. }
  526. /* 按键等待函数 */
  527. void keycont()
  528. {
  529.         fprintf(stderr, "按键继续...");
  530.         getchar();
  531. }
  532. /* 运行可执行程序函数 */
  533. void execprog()
  534. {
  535.         def_prog_mode();       
  536.         //system("clear");
  537.         //fprintf(stderr, "%s: \n", scrpos->;item);
  538.         system(scrpos->;prog);
  539.         reset_prog_mode();
  540.         keycont();
  541.         initial();
  542.         touchwin(boxwin);
  543.         touchwin(curw);
  544.         keypad(curw, TRUE);
  545.         wrefresh(boxwin);
  546.         wrefresh(curw);
  547. }
  548. /* 清除窗口函数 */
  549. void clearwin()
  550. {
  551.         wmove(boxwin, 0, 0);
  552.         wclrtobot(boxwin);
  553.         wrefresh(boxwin);
  554.         delwin(curw);
  555.         delwin(boxwin);
  556. }
复制代码
  

论坛徽章:
0
2 [报告]
发表于 2003-06-24 07:59 |只看该作者

用curses写的通用菜单修改后的正确程序!

我的已经修改过了,不过,还是多谢了。

论坛徽章:
0
3 [报告]
发表于 2003-06-24 09:22 |只看该作者

用curses写的通用菜单修改后的正确程序!

好! 继续努力!

论坛徽章:
0
4 [报告]
发表于 2003-06-24 11:58 |只看该作者

用curses写的通用菜单修改后的正确程序!


直接跟到后面就可以了

我修改过了
修改的地方也和你一样

论坛徽章:
0
5 [报告]
发表于 2003-06-25 16:18 |只看该作者

用curses写的通用菜单修改后的正确程序!

怎么我在linux7.3下运行出错了?

论坛徽章:
0
6 [报告]
发表于 2003-06-25 18:35 |只看该作者

用curses写的通用菜单修改后的正确程序!

顶一下!

论坛徽章:
0
7 [报告]
发表于 2003-06-25 19:21 |只看该作者

用curses写的通用菜单修改后的正确程序!

辛苦了!谢谢!收下!

论坛徽章:
0
8 [报告]
发表于 2003-06-25 21:56 |只看该作者

用curses写的通用菜单修改后的正确程序!

谢谢!

论坛徽章:
0
9 [报告]
发表于 2003-07-12 17:10 |只看该作者

用curses写的通用菜单修改后的正确程序!

请问如何在这个程序中动态显示时间?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2003-07-22 11:06 |只看该作者

用curses写的通用菜单修改后的正确程序!

偶置精吧,好不容易发现的,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP