1 /* play_again1.c 2 * purpuse: ask if user wants another play 3 * better : instant response without echo 4 * returns: 0 -> yes , 1 -> no 5 */ 6 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <termios.h> 10 11 #define QUESTION "Do you want another play?" 12 13 int get_response(char *); 14 void set_cr_noecho_mode(void); 15 void tty_mode(int); 16 17 int main() 18 { 19 int response ; 20 tty_mode(0); // save tty mode 21 set_cr_noecho_mode(); 22 response = get_response(QUESTION); 23 tty_mode(1); // restore tty mode 24 return response ; 25 } 26 27 int get_response(char * qiz) 28 { 29 int input ; 30 printf("%s(y/n)" , qiz); 31 while(1) 32 { 33 switch(input = getchar()) 34 { 35 case 'y': 36 case 'Y': 37 printf(" "); 38 return 0 ; 39 case 'n': 40 case 'N': 41 case EOF: 42 printf(" "); 43 return 1 ; 44 default : 45 printf(" Cannot understand %c" , input ); 46 printf("Please type y or no "); 47 } 48 } 49 } 50 51 void set_cr_noecho_mode(void) 52 { 53 struct termios ttystate ; 54 tcgetattr(0 , &ttystate); 55 ttystate.c_lflag &= ~ICANON ; // No Buffering 56 ttystate.c_lflag &= ~ECHO ;//关闭回显 57 ttystate.c_cc[VMIN] = 1 ; //Get one char one time 58 tcsetattr( 0 , TCSANOW , &ttystate); 59 } 60 61 void tty_mode(int mode) 62 { 63 static struct termios original_mode ;// 设置静态结构体变量 64 if(mode == 0 ) 65 { 66 tcgetattr( 0 , & original_mode);// 存储原有设置 67 } 68 else 69 { 70 //还原原有设置 71 if( tcsetattr(0 , TCSANOW , & original_mode) == -1 ) 72 { 73 perror("Restore tty settings failed! "); 74 } 75 } 76 }