выход терминала Linux - PullRequest
       1

выход терминала Linux

0 голосов
/ 10 августа 2011

Привет, я написал простую прогу c, чтобы просто принять пароль при воспроизведении *, чтобы скрыть ввод.Но * для последнего введенного символа не появляется в нужном месте.код ниже

int main(){  
int choice = 0;  
char pass[8];  
FILE *input;  
FILE *output;  
struct termios initial_settings, new_settings;  

if(!isatty(fileno(stdout))){  
    fprintf(stderr,"Not a terminal \n");  
}  
input = fopen("/dev/tty","r");  
output = fopen("/dev/tty","w");  
if(!input || !output){  
fprintf(stderr,"error opening");  
exit(1);  
}  
tcgetattr(fileno(input),&initial_settings);  
new_settings = initial_settings;  
new_settings.c_lflag &= ~ICANON;  
new_settings.c_lflag &= ~ECHO;  
new_settings.c_cc[VMIN] = 1;  
new_settings.c_cc[VTIME] = 0;  
new_settings.c_lflag &= ~ISIG;  
if(tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {  
fprintf(stderr,"could not set attributes\n");  
}

int count = 0;  
char ch;  
printf("Please enter the password: ");  
while (count<8){  
ch = fgetc(input);  

if(ch == '\n' || ch == '\r'){  
break;  
}else{  
fputc('*',stdout);  
pass[count] = ch;  
count++;  
}  
tcdrain(fileno(stdout));  
}  


fprintf(output,"you have entered :%s \n",pass);  
tcsetattr(fileno(input),TCSANOW,&initial_settings);  
exit(0);  
}  

Вывод следующий:
Пожалуйста, введите пароль: * * * * * * *
Вы ввели: 12345678
* pasman @ pasman-ноутбук: ~ $

Это 8-символьный пароль и обратите внимание, что 7 * появляются, как и ожидалось, но последний * появляется в конце main.

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Вы смешиваете stdio и другой поток, выводите, общаясь напрямую с tty. У них разные буферы, и они сбрасываются в разное время. Вы действительно должны просто использовать один из них.

0 голосов
/ 10 августа 2011

Это потому что ты ломаешься прежде чем пишешь последний *: так добавить

fputc('*',stdout);

до

tcdrain(fileno(stdout)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...