永发信息网

Linux C程序 输入无回显问题

答案:3  悬赏:40  手机版
解决时间 2021-04-10 06:05
  • 提问者网友:凉末
  • 2021-04-10 01:55
想做一个键盘输入不回显的C程序,在网上搜了半天,说用getch()这个函数,可是有的人又说,getch()不是标准的C里面的,不能在Linux中用,要用别的方法实现类似的功能,貌似还挺复杂。我在我的Linux RD 5中 #man getch,却说有这个函数,包含在 里面,但是 我在用的时候,又报错,说“undefined reference to 'stascr' “undefined reference to 'stascr' ”,这两个是什么东东啊! 我根本都没用到这两个函数。我彻底晕了。
还有 noecho()这个函数,也是包含在里面的,我明明包含了这个头文件,但是在引用后,编译器也报错说 这个函数没有定义,郁闷啊!!
最佳答案
  • 五星知识达人网友:夜余生
  • 2021-04-10 02:01
是在学c还是学dos,如果是想无GUI开发c的话,建议装个linux,用vi编辑代码,gcc编译,gdb调试.
关于Turbo C也可以用款叫WinTC的windows软件.
学C的话,强烈建议用Source Insight写代码和看代码!
全部回答
  • 1楼网友:玩世
  • 2021-04-10 03:49
无回显输入 noecho(); 参考例子; #include; #include; #include; #include; static struct termios stored_settings1; static struct termios stored_settings2; void echo_off(void) { struct termios new_settings; tcgetattr(0,&stored_settings1); new_settings =stored_settings1; new_settings.c_lflag &= (~echo); tcsetattr(0,tcsanow,&new_settings); return; } void echo_on(void) { tcsetattr(0,tcsanow,&stored_settings1); return; } void set_keypress(void) { struct termios new_settings; tcgetattr(0,&stored_settings2); new_settings = stored_settings2; 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_settings2); return; } int main() { printf("========================\n"); printf("0. main menu\n"); printf("1. chapter one\n"); printf("2. chapter two\n"); printf("3. chapter three\n"); printf("========================\n"); echo_off(); set_keypress(); char ch; while((ch = getchar() ) != 'q') { switch(ch) { case '0': printf("in main menu.\n");break; case '1': printf("entering chapter one\n");break; case '2': printf("entering chapter two\n");break; case '3': printf("entering chapter three\n");break; default: printf("entering other chapter.\n"); } } reset_keypress(); echo_on(); return 0; }
  • 2楼网友:青灯有味
  • 2021-04-10 02:16
实现getch函数,直接调用即可: #include #include #include typedef enum {FALSE, TRUE} bool; static struct termios newtermset, oldtermset; void noecho(void) { tcgetattr(STDIN_FILENO, &oldtermset); newtermset = oldtermset; newtermset.c_lflag &= ~ICANON; newtermset.c_lflag &= ~ECHO; newtermset.c_cc[VMIN] = 1; tcsetattr(STDIN_FILENO, TCSANOW, &newtermset); } void reset_term(void) { tcsetattr(STDIN_FILENO, TCSANOW, &oldtermset); } int getch(void) { int ch; noecho(); ch = getchar(); reset_term(); return ch; } int main(int argc, char **argv) { char buff[128]; int i, ch; bool bshow = FALSE; if (argc > 1) bshow = TRUE; printf("Please input your name: "); for (i = 0; i < sizeof(buff); ++i) { if ('\n' == (ch = getch())) break; if (bshow) putchar('*'); buff[i] = ch; } buff[i] = '\0'; printf("\nYour name is: %s\n", buff); return 0; } 建议:若只是想使用getch函数来实现无回显输入功能,就不要用ncurses了,因为你得用它的话必须要进入curses环境,而在此环境中,很多C标准输入/输出函数都会运行得不正常! 上面这个程序其实就是对终端编程,具体可自行查阅相关方面内容。 PS:上面程序知道怎么编译和运行吧。Good Luck。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯