Я знаю, что не удастся повторить * во время ввода стандартного ANSI C. Но есть ли способ показать ничего, пока кто-то вводит свой пароль в консоли. Я имею в виду, как подсказки sudo в терминале Unix/Linux. Например, если вы введете команду: sudo cp /etc/somefile ~/somedir
. Обычно вы запрашиваете пароль root. И пока вы вводите его, терминал ничего не отображает. Возможно ли это в C? Если да, то как?
Введите пароль в C
Ответ 1
Функция, которую вы ищете, это: getpass(). Вы заметите, однако, что он отмечен как "LEGACY". Хотя он никуда не денется, функция не позволяет указать размер входного буфера, что делает его не очень хорошим интерфейсом. Как отметил Jefromi, руководство glibc предоставляет переносимый примерный код для реализации getpass с нуля таким образом, который позволяет произвольный размер ввода (и isn ' t LEGACY).
Ответ 2
sudo написано на C, поэтому да:). Функция getpass()
Safyan упомянутая, вероятно, вы хотите, но здесь, где реальный инструмент sudo делает это, если вам интересно:
http://sudo.ws/repos/sudo/file/dc3bf870f91b/src/tgetpass.c#l70
Ответ 3
* Это не образец ANSI C (спасибо Билли)
Вы можете обнаружить keypress с помощью _kbhit(), а затем получить значение с помощью _getch(). Обе функции не будут отражать содержимое на экране.
#include <conio.h> //For keyboard events
#include <stdio.h> //Include this or iostream
#include <locale>
int main()
{
bool bContinue = true;
char szBuffer[255] = {0};
unsigned int nbufIndex = 0;
while (bContinue)
{
if (_kbhit())
{
szBuffer[nbufIndex] = _getch();
if (szBuffer[nbufIndex] == 0xD)
{
bContinue = false;
}
else
{
++nbufIndex;
printf("*");
}
}
}
printf("\n%s\n", szBuffer);
return 0;
}
Ответ 4
Бедственный метод заключается в том, чтобы прочитать символ ввода пользователем по символу, и после того, как каждый символ будет получен, распечатайте обратный символ, а затем *
. Вывод технически отправляется на консоль, но сразу же стирается и перезаписывается звездочкой (часто перед тем, как этот кадр даже рисуется на экране). Обратите внимание, что это не безопасный метод и имеет несколько дыр в безопасности, но для низкотехнологичных приложений с низкой степенью защиты он работает.