Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
#1

Ввод и проверка на правильность пароля - C++

28.03.2014, 16:21. Просмотров 1112. Ответов 14
Метки нет (Все метки)

Использую функцию _getch(); Если пароль соответствует всем требованиям то посимвольно заношу в массив, а на экран вывожу звездочку. В этом вроде разобрался. А как сделать чтобы стереть звездочку с экрана при нажатие backspace? из массива я понимаю как удалить, а вот с экрана((
C++
1
2
log=_getch();
if (log==8) {}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.03.2014, 16:40     Ввод и проверка на правильность пароля #2
Вот Ваш же код, но доработан мной (хотя и коряво):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include<conio.h>
#include<cstring>
using std::cout;using std::endl;using std::strcmp;
int main() 
{
    char passwd[17], ch;
    bool flag = false;
    int i = 0;
    cout<<"Password:";
    do {
        ch=_getch();
        if (i>15 || ch=='\r' || ch=='\n') {
            flag=true;
            passwd[i]='\0';
        }
        else if ( (ch>47 && ch<58) /*от 0 до 9*/
                || (ch>64 && ch<91) /*от A до Z*/
                || (ch>96 && ch<123)) /*от a до z*/
        {
        passwd[i]=ch;
        cout<<'*';
        ++i;
        }
        else if (ch==8 )
        {
            if (i>0)
            {
                passwd[i]='\n';
                --i;
                system("cls");
                cout<<"Password:";
                for (int j=0;j<i;++j) cout<<'*'; 
            }
        else { 
            cout<<endl<<"Error"<<endl;
            system("pause");
        return 0;
        }
        } while (!flag);
        if (strcmp(passwd, "test") == 0) {
            cout<<endl<<"ok"<<endl;
        }
        else {
            cout<<endl<<"Error"<<endl;
        }
        system("pause");
        return 0;
}
Добавлено через 7 минут
Небольшая опечатка(пропущена }), должно быть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
        else if (ch==8 )
        {
            if (i>0)
            {
                passwd[i]='\n';
                --i;
                system("cls");
                cout<<"Password:";
                for (int j=0;j<i;++j) cout<<'*'; 
            }
        }
        else
Сразу неточность кода не заметил, а когда подправлял, то удалил лишнюю
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
28.03.2014, 17:25  [ТС]     Ввод и проверка на правильность пароля #3
Цитата Сообщение от mustimur Посмотреть сообщение
Вот Ваш же код, но доработан мной (хотя и коряво):
Я его и переделываю. Но я вывел
C++
1
cout<<'*';
. И вот при нажатие backspace, надо удалить эту звездочку.
Я как понимаю это делается так
C++
1
if (log==8) {//здесь код для удаления звездочки}
Какой это должен быть код? Сейчас попробую ваш вариант))
C++
1
system("cls");
Стирает все, а мне нужен лишь 1 символ.

Добавлено через 42 минуты
Можно конечно использовать
C++
1
system("cls");
и потом заново вывести количество звездочек минус 1 символ, но я думаю что есть другой более легкий и правильный путь, для удаления 1 символа.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.03.2014, 17:30     Ввод и проверка на правильность пароля #4
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
Стирает все, а мне нужен лишь 1 символ.
Правильно, поэтому я и написал
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
хотя и коряво
, но вы сами код сделали несколько не удачный. Вы печатаете *, а по-идеи ими надо текст маскировать...
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
28.03.2014, 17:32  [ТС]     Ввод и проверка на правильность пароля #5
Цитата Сообщение от mustimur Посмотреть сообщение
но вы сами код сделали несколько не удачный.
Это код с учебника, я его переделываю.
Цитата Сообщение от mustimur Посмотреть сообщение
Вы печатаете *, а по-идеи ими надо текст маскировать
А вот с этого момента по подробней.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.03.2014, 17:39     Ввод и проверка на правильность пароля #6
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
А вот с этого момента по подробней.
Да это я вспомнил как это реализовалось на Windows окнах (еще старых 95/98)..... Не берите в голову, хотя вот здесь пример http://www.cplusplus.com/articles/E6vU7k9E/

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
 
string getpass(const char *prompt, bool show_asterisk=true)
{
  const char BACKSPACE=8;
  const char RETURN=13;
 
  string password;
  unsigned char ch=0;
 
  cout <<prompt<<endl;
 
  DWORD con_mode;
  DWORD dwRead;
 
  HANDLE hIn=GetStdHandle(STD_INPUT_HANDLE);
 
  GetConsoleMode( hIn, &con_mode );
  SetConsoleMode( hIn, con_mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT) );
 
  while(ReadConsoleA( hIn, &ch, 1, &dwRead, NULL) && ch !=RETURN)
    {
       if(ch==BACKSPACE)
         {
            if(password.length()!=0)
              {
                 if(show_asterisk)
                     cout <<"\b \b";
                 password.resize(password.length()-1);
              }
         }
       else
         {
             password+=ch;
             if(show_asterisk)
                 cout <<'*';
         }
    }
  cout <<endl;
  return password;
}
 
 
 
int main()
{
  const char *correct_password="null";
 
  cout <<"Test 1: echoing enabled"<<endl;
  string password=getpass("Please enter the password: ",true); // Show asterisks
  if(password==correct_password)
      cout <<"Correct password"<<endl;
  else
      cout <<"Incorrect password. Try again"<<endl;
 
  cout <<"\nTest 2: echoing disabled"<<endl;
  password=getpass("Please enter the password: ",false); // Do not show asterisks
  if(password==correct_password)
      cout <<"Correct password"<<endl;
  else
      cout <<"Incorrect password. Try again"<<endl;
 
  return 0;
}
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
28.03.2014, 18:15  [ТС]     Ввод и проверка на правильность пароля #7
Я по разбираюсь в вашем коде мне кое какие функции не понятны. На данный момент решу проблему так:
C++
1
if (log==8) {cout<<"\b"<<" "<<"\b";}
Если у кого есть идеи лучше пишите)
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.03.2014, 18:17     Ввод и проверка на правильность пароля #8
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
Если у кого есть идеи лучше пишите)
Это и есть решение)))
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
28.03.2014, 18:23  [ТС]     Ввод и проверка на правильность пароля #9
C++
1
2
char login[19],parol[19],log,pass;
login[i]=
Как из массива login[i] удалить i-тый символ? как в паскале не получается)))
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.03.2014, 18:26     Ввод и проверка на правильность пароля #10
Цитата Сообщение от ыфырф1992 Посмотреть сообщение
i-тый символ
Всмыле последний?
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
28.03.2014, 18:27  [ТС]     Ввод и проверка на правильность пароля #11
в смысле да
C++
1
if (log==8) {cout<<"\b"<<" "<<"\b";--i;login[i]=;}
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.03.2014, 18:31     Ввод и проверка на правильность пароля #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
if (log==8) {cout<<"\b"<<" "<<"\b";--i;login[i]=NULL;}
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
28.03.2014, 19:07  [ТС]     Ввод и проверка на правильность пароля #13
Как то так получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
#include<conio.h> /*для _getch */
#include<cstring> /*для strcmp*/
using std::cout;using std::endl;using std::strcmp;
int main() {
    char login[19],log,pass;int i=0,j=0;
    cout<<"Vvedite login:";
    do {
        log=_getch(); 
        if (i>16 && (log=='\r' || log=='\n')) {
            cout<<"Eror login slickom dlinn"<<'\n'<<"Vvedite login:";}
        else if (i<6 && (log=='\r' || log=='\n')){
            cout<<'\n'<<"Error login slickom korotkii"<<'\n'<<"Vvedite login:";}
        else if ((log>47 && log<58) || (log>96 && log<123)) {
            login[i]=log;cout<<'*';
            ++i;
        }
        if (log==8 && i>0) {cout<<"\b"<<" "<<"\b";--i;login[i]=NULL;}
        if (i>5 && i<17 && (log=='\r' || log=='\n')){
            login[i]='\0';break;}}
        while(true);
        if (strcmp(login, "test11")==0) {
            cout<<'\n'<<"Ok"<<endl;}
        else cout<<'\n'<<"Error"<<endl;
        system("pause");
        return 0;
    }
А как переменной pass=''Login"? на такую запись ругается. Нам нужно получить
C++
1
cout<<pass;
и что бы выводилось login. Я так понимаю в типе char хранятся только ASCII-коды. Какой тип данных тогда использовать что бы получить нужный эффект? mustimur, спасибо вам большое, улучшить вам репутацию не могу выдает ошибку.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.03.2014, 19:19     Ввод и проверка на правильность пароля #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
char *pass=''Login";
cout<<pass;
Добавлено через 8 минут
C++
1
char *pass="Login"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 19:58     Ввод и проверка на правильность пароля
Еще ссылки по теме:

Исключения. Проверка на правильность введения целого числа C++
Ввод логина и пароля C++
Ввод и проверка правильности введенного пароля C++
C++ Проверка на правильность введения строки на кириллице
C++ Проверка на правильность ввода C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ыфырф1992
25 / 25 / 12
Регистрация: 08.04.2012
Сообщений: 200
28.03.2014, 19:58  [ТС]     Ввод и проверка на правильность пароля #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
#include<conio.h> /*для _getch */
#include<cstring> /*для strcmp*/
using std::cout;using std::endl;using std::strcmp;
int main() {
    char login[19],log;int i=0,j;char *pass="login";
    for (j=0;j<2;++j){
        if (j==1){pass="Parol";i=0;}
    cout<<"Vvedite "<<pass<<":";
    do {
        log=_getch(); 
        if (i>16 && (log=='\r' || log=='\n')) {
            cout<<'\n'<<"Eror "<<pass<<" slickom dlinn"<<'\n'<<"Vvedite "<<pass<<":";i=0;}
        else if (i<6 && (log=='\r' || log=='\n')){
            cout<<'\n'<<"Error "<<pass<<" slickom korotkii"<<'\n'<<"Vvedite "<<pass<<":";i=0;}
        else if ((log>47 && log<58) || (log>96 && log<123)) {
            login[i]=log;cout<<'*';
            ++i;
        }
        if (log==8 && i>0) {cout<<"\b"<<" "<<"\b";--i;login[i]=NULL;}
        if (i>5 && i<17 && (log=='\r' || log=='\n')){
            login[i]='\0';break;}}
        while(true);
        if (strcmp(login, "test11")==0) {
            cout<<'\n'<<"Ok"<<endl;}
        else cout<<'\n'<<"Error"<<endl;
    }
        system("pause");
        return 0;
    }
А как полностью очистить login[i] (вот мы его полностью "забили", как после этого очистить). В данной программе мне это не нужно так как я присваиваю символ разделитель после нажатия enter. Ну а все же как его очистить?

Добавлено через 32 секунды
У кого есть желание покритикуйте код на корректность и оптимальность.
Yandex
Объявления
28.03.2014, 19:58     Ввод и проверка на правильность пароля
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru