linux 不回车直接读取一个字符的方法(termios结构的描述了终端的模式,在这段代码中我们改变了它,使得终端能够接收到键盘输入马上返回。)

来源:互联网 发布:校园广播软件 编辑:程序博客网 时间:2024/05/29 02:58

以下有两种,其实就是一种,都是通过更改终端的设置,但用完一定要在改回来,第一种是封装好了getch(),第二种没有封装。

termios结构的描述了终端的模式,在这段代码中我们改变了它,使得终端能够接收到键盘输入马上返回。

使用getch(),需要NCURSES库,但对这个库我不是很了解。使用时,要#include <curses.h>;编译时,要gcc test.c -l curses。根据zjq9931提供的百度文库资料,里面有两个例子,发现第一个例子直接使用的curses,效果不是很好。但第二个例子是我想要的效果(重新封装了getch())。大家可以参考zjq9931给出的链接。

我也把我写的代码放在这里供大家参考:
(其实就是参考zjq9931贴出的链接中的例2)
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <assert.h>
#include <string.h>

int getch(void);

int main(void)
{
    char c = 0;

    while (1) {
        fflush(stdin);
        c = getch();
        printf("c = %d\n", c);
    }
return 0;
}

int getch(void)
{
    int c = 0;
    int res = -1;
    struct termios org_opts, new_opts;

    res = tcgetattr(STDIN_FILENO, &org_opts);
    assert(res == 0);
    memcpy(&new_opts, &org_opts, sizeof(org_opts));
    new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE);
    tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);

    c = getchar();

    res = tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
    assert(res == 0);

    return c;
}

原理就是更改终端的设置,但用完一定要在改回来。



2.windows下面有 getch() 可以直接输入一个字符,而不需按回车。

Linux下如果想直接输入一个字符,只能使用getchar() ,而且要按回车才能触发输入,否则会一直阻塞在输入这里。网上找到一个解决办法,稍加改进,能实现跟windows下 getch() 一样的效果。

代码如下:添加头文件就可以直接使用了。


[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2.   
  3. #ifdef _WIN32 //Linux platform  
  4.     #include <conio.h>  
  5. #else  
  6.     #include <termios.h>  
  7. #endif  
  8.   
  9. char get1char(void)  
  10. {  
  11.   
  12. #ifdef _WIN32  
  13.         // Do nothing  
  14. #else   // 保存并修改终端参数  
  15.     struct termios stored_settings;  
  16.     struct termios new_settings;  
  17.     tcgetattr (0, &stored_settings);  
  18.     new_settings = stored_settings;  
  19.     new_settings.c_lflag &= (~ICANON);  
  20.     new_settings.c_cc[VTIME] = 0;  
  21.     new_settings.c_cc[VMIN] = 1;  
  22.     tcsetattr (0, TCSANOW, &new_settings);  
  23. #endif  
  24.   
  25.     int ret = 0;  
  26.     char c;  
  27.   
  28. #ifdef _WIN32  
  29.     c = getch();  
  30. #else  
  31.     c = getchar();  
  32.     putchar('\b'); // 删除回显  
  33. #endif  
  34.   
  35.     printf("input:  [%c]\n", c);  
  36.   
  37. #ifdef _WIN32  
  38.     // Do nothing  
  39. #else  
  40.     tcsetattr (0, TCSANOW, &stored_settings); // 恢复终端参数  
  41. #endif  
  42.   
  43.     return c;   
  44. }  

0 0
原创粉丝点击