Как работает этот код?

Я не понял эту функцию. Может кто-нибудь объяснить мне полный код? Что делает эта строчка для *(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 ?
         }
    }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

*(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, поэтому этот код не учитывает другие платформы.

paxbun 11.08.2018 04:15

Другие вопросы по теме