我不了解此功能。有人可以向我解释完整的代码吗?这行*(pass+i) = temp_passP[i];
是什么?
还有printf \a printf \b
是什么意思?
void get_password(char* pass)
{
char temp_passP[25];
int i=0;
while(1)
{
temp_passP[i]=getch();
if(temp_passP[i]==13){break;}
else if(temp_passP[i]==8)
{
if(i!=0) {
printf("\b \b");
i--;
} else {printf("\a");}
}
else
{
printf("*");
*(pass+i) = temp_passP[i];
i++;
}
*(pass+i)='\0'; what it means ?
}
}
答案 0 :(得分:3)
*(pass+i)
等效于pass[i]
。您必须了解指针。 '\b'
表示退格键,它将光标向左移动。 '\a'
表示机敏,发出哔哔声或铃声。
8等于'\b'
。 temp_passP[i]==8
的意思是“用户按下退格键时”。它将光标向左移动,打印空间,并且由于光标向右移动,因此再次将光标向左移动。
当用户按下其他键时,它将打印'*'
并将输入复制到pass[i]
。
简而言之,该程序将获得输入,直到用户按下Enter键并将其复制到pass
中为止。
答案 1 :(得分:1)
关于此功能的第一件事是,它不是很好。 char temp_passP[25]
应该只是int ch
,然后对char temp_passP[i]
的所有引用都可以是ch
。有了这一更改,可能更容易看到代码只是通过getch()从stdin中读取字符,一次读取一个字符,然后检查每个字符。
首先,它将字符与13相比较,这是回车的ASCII码。在某些系统上,当用户键入ENTER时,系统会将两个字符回车符和换行符放到stdin流中。因此,此检查正在寻找终点线。 (在其他环境中,ENTER仅生成换行符(ASCII 10),因此该代码在那里不起作用。)
然后该函数将字符与8进行比较,这是Backspace的ASCII码。该代码正在检查用户是否要删除最后输入的字符。如果是这样,它将备份指针到pass
缓冲区中,并打印"\b \b"
序列,该序列从屏幕上删除该字符的星号。如果pass
缓冲区中没有字符,或者是因为尚未输入任何字符,或者是所有字符都已用Backspace删除了,则"\a"
的作用是使铃声响起。
如果字符没什么特别的,则将其与pass
(或*(pass+i) = temp_passP[i];
)一起写入*(pass+i) = ch;
缓冲区。
*(pass+i) = '\0';
命令确保pass
缓冲区始终是空终止的,直到最后一个未被删除的字符。