Linux上的getch(), 清屏问题以及printf不立即显示的问题

getch()

getch() 在Linux上不能用, 最开始采用的替换方式是用
initscr(); // getch()使用前的初始化
endwin(); // getch()使用后的注销
但是发现有问题, 后采用

#include <termios.h>
int getch(void) {
    struct termios tm, tm_old;
    int fd = STDIN_FILENO, c;
    if (tcgetattr(fd, &tm) < 0)
        return -1;
    tm_old = tm;
    cfmakeraw(&tm);
    if (tcsetattr(fd, TCSANOW, &tm) < 0)
        return -1;
    c = fgetc(stdin);
    if (tcsetattr(fd, TCSANOW, &tm_old) < 0)
        return -1;
    if (c == 3)
        exit(1);
    //按Ctrl+C结束退出
    return c;
}

清屏问题

system(“clear”) 有问题,
显示环境变量没有设置, 但clear是环境变量
所以改用 puts("\033[2J");
ANSI/VT100 Terminal Control Escape Sequences ANSI控制码

printf不立即显示的问题:

  • printf行缓冲的概念以及刷新缓冲区的条件
  • 什么是行缓冲?
  • 当输入输出遇到换行符的这类缓冲定义为行缓冲。标准输入和标准输出都是行缓冲。stderr无缓冲,不用经过fflush或exit,就直接打印出来
  • 引入缓冲区的目的是什么?
  • 操作系统为减少 IO操作 所以设置了缓冲区. 等缓冲区满了再去操作IO. 这样是为了提高效率.减少CUP等待IO而浪费CPU资源。
  • 缓冲区刷新的条件:
    1.进程结束。
    2.遇到\n。\n具备刷新缓冲区的作用
    3.缓冲区满。printf函数的缓冲区大小为1024个字节,当超出缓冲区的大小,缓冲区会被刷新。
    4.手动刷新缓冲区fflush(stdout)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值