QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1687|回复: 7

求助--C语言如何实现终端命令上翻功能

[复制链接]
发表于 2006-8-28 16:35:16 | 显示全部楼层 |阅读模式
用C语言怎么实现像终端那种, 当按 KEY_UP时, 会显示上一次输入的命令的程序?
我自己想的代码如下, 可是不能实现:
[code:1]
#include <stdio.h>
                                                                                
int main(void)
{
    char *strs[] = {"String1", "String2"};
    char input[10];
                                                                                
    printf("Please Input a word:");
    fprintf(stdin, "%s", strs[0]);
    fflush(stdin);
                                                                                
    fscanf(stdin, "%s", input);
    printf("Input is %s\n", input);
                                                                                
    return 0;
}[/code:1]
发表于 2006-8-28 17:38:37 | 显示全部楼层
我觉得每执行一个命令 就向一个文件中写入这条命令+一个换行
读的时候从第一行开始读不就可以了?
回复

使用道具 举报

 楼主| 发表于 2006-8-28 17:54:16 | 显示全部楼层
[quote:09d18f1c8d="wjfree"]我觉得每执行一个命令 就向一个文件中写入这条命令+一个换行
读的时候从第一行开始读不就可以了?[/quote]

我是自己写了个命令行词典的程序, 经常输入错误, 所以想实现上翻的功能,
上翻几次就可以了, 并不须要保存到文件, 数组就可以了.
现在的问题是:
[code:1]
怎么在程序执行时, 输入 "<" 字符, 实现上翻. 即上一次输入的单词.

[/code:1]
回复

使用道具 举报

发表于 2006-8-29 11:00:06 | 显示全部楼层
说到底是一个键盘事件处理的问题吧?
建议用ncurses库开发
回复

使用道具 举报

 楼主| 发表于 2006-8-29 11:30:28 | 显示全部楼层
[quote:4f83967f69="mozilla"]说到底是一个键盘事件处理的问题吧?
建议用ncurses库开发[/quote]
也不是这样. 我的意思是:

  怎么把上一次的输入保存起来(数组中), 然后当第二次输入时,按 KEY_UP 可以把其显示出来, 当做这次输入(的一部分), 而不是单纯的屏幕的显示(不可更改). 也就是说把其保存在 stdin 中, 然后 fflush, 但是我上面的代码不能实现这个功能.
  键盘事件可以先不提.
[code:1]
Input the word('q' for Quit): WWW

WWW
---------------------------
n.
  World Wide Web 万维网, 简称WWW或3W

Input the word('q' for Quit):
[/code:1]
就是怎么在这次输入时让上次输入的 "WWW" 作为输入的一部分.
回复

使用道具 举报

发表于 2006-8-29 16:49:31 | 显示全部楼层
一个笨方法:你把键盘输入接管过来,可编辑内容放在一个buffer里,按一次退格件删一个字符并刷新屏幕。

还是建议你用ncurses,把文本放在编辑框里,随你怎么编辑都行。
回复

使用道具 举报

 楼主| 发表于 2006-8-29 17:25:28 | 显示全部楼层
[quote:ec14f3a87d="mozilla"]一个笨方法:你把键盘输入接管过来,可编辑内容放在一个buffer里,按一次退格件删一个字符并刷新屏幕。

还是建议你用ncurses,把文本放在编辑框里,随你怎么编辑都行。[/quote]

如何把 "键盘输入接管过来" ? 是不是要实现一个像高级语言中的 SendKey()函数
那怎么实现呢? 给点提示.

[code:1]
fprintf(stdin, "%s", str);
[/code:1]
为什么不行?
回复

使用道具 举报

发表于 2006-8-30 09:15:10 | 显示全部楼层
其实就是做一个kbhit(),然后自己处理键盘输入
[code:1]
#include <sys/ioctl.h>
#include <stdio.h>
#include <termio.h>
#include <unistd.h>
#include <stdlib.h>

struct termio ttysave;
void restore()
{
    if(ioctl(0, TCSETAF, &ttysave)==-1){
        printf("restore error\n");
    }
    return;
}
int set_tty()
{
    struct termio tty;
    if(ioctl(0, TCGETA, &tty)==-1){
        printf("error while setup tty\n");
        return -1;
    }
    ttysave = tty;
    tty.c_lflag &= ~(ICANON | ECHO| ISIG);
    tty.c_cc[VMIN] = 1;
    tty.c_cc[VTIME] = 0;
    if(ioctl(0, TCSETAF, &tty)==-1){
        restore();
        printf("error while setup tty\n");
        return -1;
    }
    return 0;
}
                            
int kbhit()
{
    char ch;
    read(0, &ch, 1);
    return ch;
}

main()
{
    set_tty();
    while(1)
    {
        int a;
        a=kbhit();
        if(a>='a'&&a<='z')
        {
            printf("you press %c\n",a);
            if(a=='q')
                break;
        }
        else
            printf("key code = %x\n",a);
    }
    restore();
}
[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 08:18 , Processed in 0.050199 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表