Я не понял эту функцию. Может кто-нибудь объяснить мне полный код? Что делает эта строчка для *(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 ?
}
}
*(pass+i)
эквивалентен pass[i]
. Вы должны узнать об указателях. '\b'
означает возврат, перемещает курсор влево. '\a'
означает предупреждение, он издает звуковой сигнал или звонок.
8 невероятно похож на '\b'
. temp_passP[i]==8
означает «Когда пользователь нажал клавишу возврата». Он перемещает курсор влево, печатает пробел, и, поскольку курсор перемещается вправо, он перемещает курсор влево еще раз.
Когда пользователь нажимал другие клавиши, он печатает '*'
и копирует ввод в pass[i]
.
Вкратце, эта программа получает ввод, пока пользователь не нажмет клавишу ввода и не скопирует его в pass
.
Первое, что нужно понять об этой функции, это то, что она не очень хороша. char temp_passP[25]
должен быть просто int ch
, тогда все ссылки на char temp_passP[i]
могут быть ch
. С этим изменением может быть легче увидеть, что код просто считывает символы из stdin через getch (), по одному символу за раз, и проверяет каждый из них.
Во-первых, он сравнивает символ с 13, который является кодом ASCII для возврата каретки. В некоторых системах, когда пользователь вводит ENTER, система помещает два символа возврата каретки и перевода строки в поток стандартного ввода. Итак, эта проверка ищет конечную строку. (В других средах ENTER генерирует только перевод строки (ASCII 10), поэтому этот код там работать не будет.)
Затем функция сравнивает символ с 8, который является кодом ASCII для Backspace. Код проверяет, удаляет ли пользователь последний введенный символ. Если это так, он создает резервную копию указателя в буфере pass
, а также печатает последовательность "\b \b"
, которая стирает звездочку для этого символа с экрана. Если в буфере pass
нет символов, либо потому, что ни один из них еще не введен, либо все были удалены с помощью Backspace, "\a"
предназначен для того, чтобы звонок зазвонил.
Если в символе нет ничего особенного, он записывается в буфер pass
с помощью *(pass+i) = temp_passP[i];
(или *(pass+i) = ch;
).
Команда *(pass+i) = '\0';
гарантирует, что буфер pass
всегда завершается нулем после последнего символа, который не был удален.
Хороший ответ, но getch - это функция Windows, поэтому этот код не учитывает другие платформы.