打印的内容似乎不太对

打印的内容似乎不太对

代码:

#include<stdio.h>
#include<termios.h>
#include<unistd.h>


int main(int argc, char *argv[])
{
struct termios new_tm, old_tm;
// get the current terminal settings to old_tm.
tcgetattr(fileno(stdin), &old_tm);
// Copy the old terminal settings to new_tm.
new_tm = old_tm;
// Cancel echo
// new_tm.c_lflag &= ~(ICANON | ECHO); // 关闭规范模式和回显;  // This only cancels the echo
// new_tm.c_cc[VTIME] = 0;             // 超时时间为0秒
// new_tm.c_cc[VMIN] = 1;              // 最少需要1个字符
//set new terminal attributes to raw .
cfmakeraw(&new_tm); // sets the terminal to something like the "raw" mode of the old Version 7 terminal driver: input is available character by character, echoing is disabled, and all special processing of terminal input and output characters is disabled.
// applied to new_tm
tcsetattr(STDIN_FILENO, TCSANOW, &new_tm);

int ch;
while(1){
ch = getchar();
if(ch == 'q' || ch == 'Q'){
break;
}else if(ch == '\r'){//回车键
printf("down\n");
}else if(ch == '\33'){// ^[[A  ^[[B ^[[C ^[[D
ch = getchar();
if (ch == '['){
ch = getchar();
switch (ch)
{
case 'A':
printf("up\n");
break;
case 'B':
printf("down\n");
break;
case 'C':
printf("right\n");
break;
case 'D':
printf("left\n");
break;
default:
break;
}
}
}
}

// restore the original terminal settings.
tcsetattr(STDIN_FILENO, 0, &old_tm);
return 0;
}

我打印出来的样子:
https://img1.sycdn.imooc.com/climg/673b20d5099b519d04610188.jpg
这是为什么?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
大白老师 1天前
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
#include <termios.h>

//获取一个字符,不回显
int getch()
{
struct termios tm,tm_old;
//保存正常 输入属性 到 tm_old
tcgetattr(0,&tm_old);
//获取原始输入属性
cfmakeraw(&tm);
//设置原始输入属性
tcsetattr(0,0,&tm);
//不回显的获取一个字符
int ch = getchar();
//恢复正常输入属性
tcsetattr(0,0,&tm_old);

return ch;
}

void key_control()
{
int ch;
while(1){
ch = getch(); //^[
if(ch == 'q' || ch == 'Q'){
break;
}else if(ch == '\r'){//回车键
printf("down\n");
}else if(ch == '\33'){// ^[[A ^[[B ^[[C ^[[D
ch = getch(); //[
if(ch == '['){
ch = getch(); //A,B,C,D
switch(ch){
case 'A': //上
printf("up\n");
break;
case 'B': //下
printf("down\n");
break;
case 'C': //右
printf("right\n");
break;
case 'D': //左
printf("left\n");
break;
default:
break;
}
}
}
}
}

int main()
{
key_control();
return 0;
}
大白老师 1天前
你这里是用getchar获取的数据,不回显得代码并不是只设置一次就生效的!参考下面代码的写法
  • 提问者 阿大月 #1

    额,可能是显示格式的问题,老师可能也没有仔细看
    我没有分开写成函数,我是都写在了main函数中,在getchar之前先进行了取消回显的设置
    在整个代码的结束才设置回原来的终端属性
    我的问题也不是回显有问题,关闭回显没有问题,我的问题是:"我的打印为啥不是从行首开始的"
    当然,昨天我做了搜索已经找到原因了
    还是谢谢老师了

    19小时前
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师