gpt4 book ai didi

linux 终端输出

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:02 27 4
gpt4 key购买 nike

您好,我写了一个简单的 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-laptop:~$

它是一个 8 个字符的密码,注意 7 个 * 按预期出现,但最后一个 * 出现在 main 的末尾。

最佳答案

你正在混合 stdio 和另一个流,输出,直接与 tty 对话。它们有不同的缓冲区,并在不同的时间被刷新。您真的应该只使用其中之一。

关于linux 终端输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7006045/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com