UNIX_C 环境下实现输入一个字符,不用回车直接输入功能(类型windows下_getch(void)函数)

/*int getch ( void );        输入流获取一个信号当键盘输入一个字符时,不用回车不会会写,直接读取输入的字符并继续运行//linux 标准头文件库#include <unistd.h>#include <sys/ioctl.h>#include <termios.h>//windows 标准头文件库#include <conio.h>//调用函数int ch = getch();
*/#ifdef WIN32
//windows 默认函数
//int __cdecl _getch(void);#else//linux 环境下代码
int getch(void)
{struct termios term_old;ioctl( STDIN_FILENO, TCGETS, &term_old );struct termios term_new = term_old;term_new.c_lflag &= ~( ECHO | ICANON ); //取消会写与回车ioctl( STDIN_FILENO, TCSETS, &term_new );int ch = getchar();ioctl(STDIN_FILENO, TCSETS, &term_old);return ch;
}

</pre><pre code_snippet_id="1748202" snippet_file_name="blog_20160706_1_4593356" name="code" class="html">
<span style="font-size:18px;color:#ff0000;"><strong>编程实践教程》一书,里面有较详细的讲解,现将以上技巧如果实现及代码优化如下,还会不断改进</strong></span>

终端规范模式开启于关闭,使得缓冲和编辑失效

#include <termios.h>

#include<unistd.h>

 int tcgetattr(int fd, structtermios *termios_p);

参 1:设备终端的文件描述符:0——标准输入,1——标准输出,2——标准错误

参 2:struct termios original_mode{

……

tcflag_t c_lflag;    //本地模式标志,控制终端编辑功能

                 cc_t     c_cc[NCCS];

};

c_lflag:ICANON —— 使用标准输入模式

eg:original_mode.c_lflag&= ~ICANON ——  去除标准输入模式

ECHO   —— 回显功能

eg:original_mode.c_lflag&= ~ECHO   —— 关闭回显功能

c_cc[NCCS]:控制字符,用于保存终端驱动程序中的特殊字符,如输入结束符等

NCCS: VMIN —— 非规范模式读取时的最小字符数

eg:original_mode.c_c[VMIN] =1

功能:用于获取与终端相关的参数,返回的结果保存在termios结构体中

int tcsetattr(int fd, int optional_actions, const struct termios*termios_p);

参 1:fd为打开的终端文件描述符,一般给 0;

参 2:optional_actions用于控制修改起作用的时间

* TCSANOW:     不等数据传输完毕就立即改变属性

参 3:而结构体termios_p中保存了要修改的参数

返回:函数在成功的时候返回0,失败的时候返回-1

功能:用于设置终端参数参数参数

//终端规范模式的关闭与开启
//实现缓冲和编辑失效#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
int tty_mode( int flg )
{static struct termios mode;if( 0 ==  flg ){//获取if( !0 == tcgetattr(0, &mode) ){perror("tcgetattr error");return -1;}}else if( 1 == flg ){//设置if( -1 == tcsetattr(0, TCSANOW, &mode) ){perror("tcgetattr error");return -1;}}else{return -1;}return 0;
}int set_tty_mode(void)
{struct termios new_mode;//获取当前终端参数信息if( !0 == tcgetattr(0, &new_mode)){perror("tcgetattr error");return -1;}//去除标准输入模式new_mode.c_lflag &= ~ICANON;//关闭回显功能new_mode.c_lflag &= ~ECHO; //非规范模式下读取一个字符new_mode.c_cc[VMIN] = 1;if(-1 == tcsetattr(0, TCSANOW, &new_mode) ){perror("tcstattr error");return -1;}return 0;
}int choose( void )
{printf("是否继续输入<Y/N>:");char c = getchar();switch(c){case 'Y':case 'y':printf("\n");printf("将继续输入!\n");return 0;case 'N':case 'n':printf("\n");printf("将退出程序!\n");return 0;default:return -1;}}//当exit退出时将调用次函数恢复当前值
void atexit_function( void )
{int res = tty_mode(1);    //还原终端相关参数信息if( -1 == res ){printf("终端设置失败!\n");exit(1);}exit(1);
}//或signal SIGINT信号将激活此函数
void signal_function( int  signum )
{int res = tty_mode(1);    //还原终端相关参数信息if( -1 == res ){printf("终端设置失败!\n");exit(1);}exit(1);
}int main( void )
{atexit( atexit_function );if( SIG_ERR  == signal(SIGINT, signal_function) ){perror("signale error");_Exit(1);}int res = tty_mode(0);  //获取终端相关参数信息if( -1 == res ){printf("终端获取失败!\n");_Exit(1);}//设置终端非规范模式res = set_tty_mode();res = choose(); if(-1 == res ){printf("选择失败!\n");exit(1);}}

UNIX_C 环境下实现输入一个字符,不用回车直接输入功能(类型windows下_getch(void)函数)相关推荐

  1. C语言九十三之输入一个字符x,找到输入的那句话(字符串)里面一样字母的位置。

    1.题目 输入一个字符x,找到输入的那句话里面一样字母的位置. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科目.帮助C语言学者打好程序基础.C语言基础,锻 ...

  2. 【C#基础】输入一个字符,判定它是什么类型的字符(大写字母,小写字母,数字或者其它字符)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 输入一个字符自动回车....

    #include <stdio.h> #include <conio.h>  int main() { printf("input "); char a; ...

  4. 输入asc码输出字符c语言,输入一个字符输出ascii码

    C语言 输入一个字母,输出与之对应的ASCII码,输入用C语言编写. #include "stdafx.h" //VS 预编译头文件,其他系统请删除 #include #inclu ...

  5. 从键盘输入一个字符,判断其是不是大写字母,如果是则请输出这个大写字母,如果不是请输出“这不是一个大写字母”的英文信息(要求:能连续输出直到输出“#”结束)。

    从键盘输入一个字符,判断其是不是大写字母,如果是则请输出这个大写字母,如果不是请输出"这不是一个大写字母"的英文信息(要求:能连续输出直到输出"#"结束). P ...

  6. python中将字符变为大写_python 输入一个字符,是小写转换为大写,大写转换为小写,其他字符原样输出...

    原博文 2018-11-03 22:07 − s = input('请输入一个字符:') if 'a' <= s <= 'z': print(chr(ord(s) - 32)) elif ...

  7. 求前驱字符和后继字符。输入一个字符,找出它的前驱字符和后继字符,并按ASCII码值,按从大到小的顺序输出这三个字符及其对应的ASCII码值。

    #include<stdio.h> int main() { char a; //输入一个字符 scanf("%c", &a); //后继字符 printf(& ...

  8. Java中如何输入一个字符

    在一次编写代码时需要让程序接收一个字符,当我写出scanner.next时,我惊奇的发现,Scanner类中没有定义读取char的方法!!! Java中的扫描器类支持nextInt(),nextLon ...

  9. 【Java】如何输入一个字符

    暑假开始学习Java啦. 在编写代码需要让程序接收一个字符时,当我依照nextInt(),nextLong(),nextDouble() 等写出 nextChar() 时,却惊讶地发现并没有nextC ...

最新文章

  1. Matlab/Simulink ROS
  2. openfiler 搭建虚拟存储 并 配置服务端 (转载)
  3. golang beego 数据输出 返回值
  4. 遇到“BUG: soft lockup - CPU#0 stuck for 22s”的解决思路
  5. .net环境iis执行php,十步!轻松搞定IIS+PHP环境
  6. python输出数字方阵_在python里输出数字方阵
  7. access 战地1不加入ea_炒牛肉时,想要牛肉嫩滑又不老,只需加入1样东西,很多人都不懂...
  8. python 元类的call总结_Python 类与元类的深度挖掘 I【经验】
  9. 面试了57位高级产品经理,我发现混得好的人都有这个特质!
  10. JBox2D学习 - 小球碰撞实例 .
  11. Android WebView使用深入浅出
  12. 两轮差速机器人坐标系及运动轨迹描述
  13. java获取当前行数
  14. 白板推导系列Pytorch-隐马尔可夫模型-概率计算问题
  15. android中webview的实现
  16. java 输入一个数四舍五入_Java程序将数字四舍五入到n个小数位
  17. C++、Java、JavaScript中回调的用法
  18. 残疾人竞赛计算机程序,第五届全国残疾人职业技能竞赛竞赛标准计算机程序.doc...
  19. 解决图片无法打开的问题: “Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足”
  20. Leetcode-1002:查找常用字符(简单解法)

热门文章

  1. 【无人机】基于Matlab实现高效局部地图搜索算法附论文
  2. 计算机系统结构相关的论文,计算机系统结构毕业论文题目.doc
  3. android轮播图简单实现(左右无限滑动,自动轮播)
  4. 郭逸淵:4月7日比特幣(BTC)以太坊(ETH)行情分析及布局思路
  5. PMP 考点 第三章 项目经理的角色
  6. Git 开发分支合并到develop分支用法
  7. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements的解决方法
  8. WebStorm开发应用——前端页面
  9. 黑苹果gtx1050显卡驱动问题
  10. 初代网红绿茶餐厅闯关IPO:翻台率萎靡、上市难回春