getchar( ) 不接收回车不回显设置

这两天做通信实验,发送端使用的循环的getchar()来发送字符。

结果发现,除了想要发送的字符外,最后总还有个换行符。

后来研究发现,是由于getchar()在回车后(输入了需要的字符之后),

linux并不是直接将回车丢掉,而是将它保存在行缓冲中。

这样,下个循环的getchar()就把回车发了出去。

所以,为了在控制台输入数据,而不需要回车,就需要做如下的设置:

#include <termios.h>
static struct termios stored_settings;

void set_keypress(void)
{
    struct termios new_settings;

    tcgetattr(0,&stored_settings);    // 存储旧的模式

    new_settings = stored_settings;

    /* Disable canonical mode, and set buffer size to 1 byte */
    new_settings.c_lflag &= (~ICANON);    // 不使用标准模式,即取消行缓冲
    new_settings.c_cc[VTIME] = 0;
    new_settings.c_cc[VMIN] = 1;

    tcsetattr(0,TCSANOW,&new_settings);
    return;
}

void reset_keypress(void)
{
    tcsetattr(0,TCSANOW,&stored_settings); // 恢复旧模式
    return;
}

tcgetattr() 和tcsetattr() 中的0是标准输入fd。

TCSANOW是改变立即发生。

c_lflag是本地模式。

c_cc是控制字符。

termios的详细介绍请参考 Termios

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值