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

getch()

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

#include 
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)。

你可能感兴趣的:(c语言)