Как отобразить звездочку (*) вместо простого текста для пароля с ++ - PullRequest
2 голосов
/ 30 мая 2011

Как я могу сделать так, чтобы я мог отображать звездочку (*) вместо обычного текста для пароля в C ++.

Я спрашиваю пароль, и это просто пропуск на экране.

Как я могу преобразовать их в звездочку (*), чтобы пользователь не мог видеть пароль при вводе.

Это то, что у меня сейчас

        char pass[10]={"test"};
        char pass1[10];
        textmode(C40);
        label:
        gotoxy(10,10);
        textcolor(3);
        cprintf("Enter password :: ");
        textcolor(15);
        gets(pass1);
        gotoxy(10,11);
        delay(3000);
        if(!(strcmp(pass,pass1)==0))
        {
          gotoxy(20,19);
          textcolor(5);
          cprintf("Invalid password");
          getch();
          clrscr();
          goto label;
        }

Спасибо

Ответы [ 3 ]

7 голосов
/ 30 мая 2011

Вам необходимо использовать небуферизованную функцию ввода, например getch (), предоставляемую библиотекой curses или консольной библиотекой вашей ОС.Вызов этой функции вернет символ нажатой клавиши, но не даст эхо.Вы можете вручную напечатать * после прочтения каждого символа с помощью getch ().Также вам нужно написать код, если нажата клавиша Backspace, и соответствующим образом исправить введенный пароль.

Вот код, который я однажды написал с помощью проклятий.Компилировать с gcc file.c -o pass_prog -lcurses

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>

#define ENOUGH_SIZE 256

#define ECHO_ON 1
#define ECHO_OFF 0

#define BACK_SPACE 127

char *my_getpass (int echo_state);

int main (void)
{
  char *pass;

  initscr ();

  printw ("Enter Password: ");
  pass = my_getpass (ECHO_ON);

  printw ("\nEntered Password: %s", pass);
  refresh ();
  getch ();
  endwin ();
  return 0;
}


char *my_getpass (int echo_state)
{
  char *pass, c;
  int i=0;

  pass = malloc (sizeof (char) * ENOUGH_SIZE);
  if (pass == NULL)
  {
    perror ("Exit");
    exit (1);
  }

  cbreak ();
  noecho ();

  while ((c=getch()) != '\n')
  {
    if (c == BACK_SPACE)
    {
      /* Do not let the buffer underflow */
      if (i > 0)
      { 
        i--;
        if (echo_state == ECHO_ON)
               printw ("\b \b");
      }
    }
    else if (c == '\t')
      ; /* Ignore tabs */
    else
    {
      pass[i] = c;
      i = (i >= ENOUGH_SIZE) ? ENOUGH_SIZE - 1 : i+1;
      if (echo_state == ECHO_ON)
        printw ("*");
    }
  }
  echo ();
  nocbreak ();
  /* Terminate the password string with NUL */
  pass[i] = '\0';
  endwin ();
  return pass;
}
5 голосов
/ 30 мая 2011

Нет ничего в C ++ как таковом, чтобы поддержать это. Функции в вашем примере кода предполагают, что вы используете curses или что-то подобное; если это так, проверьте функции cbreak и nocbreak. После того как вы позвонили cbreak, вы должны повторить символы, и вы можете повторить все, что захотите (или ничего, если хотите).

2 голосов
/ 13 декабря 2014
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void main()
{
 clrscr();
 char a[10];
 for(int i=0;i<10;i++)
 {
  a[i]=getch();     //for taking a char. in array-'a' at i'th place 
  if(a[i]==13)      //cheking if user press's enter 
  break;            //breaking the loop if enter is pressed  
  printf("*");      //as there is no char. on screen we print '*'
 }
 a[i]='\0';         //inserting null char. at the end
 cout<<endl;
 for(i=0;a[i]!='\0';i++)  //printing array on the screen
 cout<<a[i];
 sleep(3);                //paused program for 3 second
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...