簡體   English   中英

linux 端子 output

[英]linux terminal output

嗨,我寫了一個簡單的 c prog 只接受密碼,同時顯示*隱藏輸入。 但是輸入的最后一個字符的 * 沒有出現在正確的位置。 代碼如下

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);  
}  

output如下:
請輸入密碼:* * * * * * *
您已輸入:12345678
* pasman@pasman-laptop:~$

它是一個 8 個字符的密碼,請注意 7 個 * 出現在預期中,但最后一個 * 出現在 main 的末尾。

您正在混合 stdio 和另一個 stream、output,直接與 tty 對話。 它們有不同的緩沖區,並在不同的時間被刷新。 你真的應該只使用其中之一。

這是因為你在寫最后一個 *: 之前就中斷了,所以添加

fputc('*',stdout);

tcdrain(fileno(stdout)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM