 |
Внутри - Вопросы и ответы, обсуждения - Ваши вопросы по C/C++ только в данном разделе |
09.01.2014, 02:19
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 20.11.2011
 Сообщений: 4
 Популярность: 65
 Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
|
Внутри
Вобщем кину часть кода:
int a;
a = 24001;
cout<<"Введите пароль: \n";
cin>>a;
if (a == 24001)
{
cout<<"Правильный пароль\n\n";
}
else
{
cout<<"Неправильный пароль !\n;
}
Если ввести буквы или к примеру очень большое число то программа пишет что "правильно" и начинается бесконечное повторение этого слова. В общем сбой.
Как избежать этого и сделать так чтобы кроме указанного пароля программа не реагировала ни на какой другой пароль, будь то числовое или символьное.
Возможно очень легкий и глупый вопрос, скорее так и есть...
Последний раз редактировалось Enginerr; 09.01.2014 в 02:24.
|
|
|
09.01.2014, 04:39
|
#2
|
|
|
|
Пехотинец
|
 Регистрация: 10.10.2011
 Сообщений: 65
 Популярность: 772
 Сказал(а) спасибо: 58
Поблагодарили 58 раз(а) в 33 сообщениях
|
Re: Внутри
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Вобщем кину часть кода:
int a;
a = 24001;
cout<<"Введите пароль: \n";
cin>>a;
if (a == 24001)
{
cout<<"Правильный пароль\n\n";
}
else
{
cout<<"Неправильный пароль !\n;
}
Если ввести буквы или к примеру очень большое число то программа пишет что "правильно" и начинается бесконечное повторение этого слова. В общем сбой.
Как избежать этого и сделать так чтобы кроме указанного пароля программа не реагировала ни на какой другой пароль, будь то числовое или символьное.
Возможно очень легкий и глупый вопрос, скорее так и есть...
|
|
 |
|
 |
|
Вы допустили ошибку в коде поэтому при считывании данных не своего типа пароль правильный
Для этого вам надо просто убрать строку a = 24001; 
Ошибка в том что вы инициализируете переменную числом равным паролю
И когда вводится в консоле данные не её типа они просто не записываются
Переменная не меняется и равна паролю....
Если же вы хотите пароль из символов
int a[10] = {0};
cout<<"Введите пароль: \n";
cin>>&a;
if (a == 'jn24001jn')
{
cout<<"Правильный пароль\n\n";
}else {
cout<<"Неправильный пароль !\n;
}
|
|
|
09.01.2014, 10:11
|
#3
|
|
|
|
Пехотинец
|
 Регистрация: 07.07.2012
 Сообщений: 60
 Популярность: 171
 Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
|
Re: Внутри
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
int a[10] = {0};
cout<<"Введите пароль: \n";
cin>>&a;
if (a == 'jn24001jn')
{
cout<<"Правильный пароль\n\n";
}else {
cout<<"Неправильный пароль !\n;
}
___
|
|
 |
|
 |
|
Точнее:
Код:
std::string pas;
cin >> pas;
if (!pas.compare("your_real_password"))
{
std::cout << "Correct!"
}
else
{
std::cout << "Wrong password !"
}
артём612, твой код содержит 3 ошибки.
1. Фиксированный малый объем буфера под пароль дает возможность к атаке через buffer-overflow
2. В cin нужно передать просто "a", а не адрес а. Или же &a[0]
3. Сравнение строк через "==" недопустимо и не работает так, как хотелось бы. Нужно использовать функции сравнения строк.
|
|
|
09.01.2014, 12:46
|
#4
|
|
|
|
Разведчик
|
 Регистрация: 20.11.2011
 Сообщений: 4
 Популярность: 65
 Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
|
Re: Внутри
Всё заработало =)
Спасибо Артёму за разъяснение, а twice за улучшенный код.
Добавлено через 1 час 18 минут
Ещё вопрос, вот допустим мини код:
switch (a)
case1:
cout<<"Один \n";
break;
case 2:
cout<<"Два \n";
break;
default:
cout<<"Ошибка \n";
break;
Как тут защититься от переполнения буфера? Потому что у меня есть меню в программе и там аналогичное с паролем, если набрать длинные цифра или буквы то идёт сбой.
Последний раз редактировалось Enginerr; 12.01.2014 в 03:38.
Причина: Добавлено сообщение
|
|
|
17.01.2014, 09:30
|
#5
|
|
|
|
Пехотинец
|
 Регистрация: 07.07.2012
 Сообщений: 60
 Популярность: 171
 Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
|
Re: Внутри
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Всё заработало =)
Спасибо Артёму за разъяснение, а twice за улучшенный код.
Добавлено через 1 час 18 минут
Ещё вопрос, вот допустим мини код:
switch (a)
case1:
cout<<"Один \n";
break;
case 2:
cout<<"Два \n";
break;
default:
cout<<"Ошибка \n";
break;
Как тут защититься от переполнения буфера? Потому что у меня есть меню в программе и там аналогичное с паролем, если набрать длинные цифра или буквы то идёт сбой.
|
|
 |
|
 |
|
Тут все зависит от того, что за переменная а.
Если это строка, то данная конструкция не рабочая, надо использовать
Код:
const std::string case1 = "first";
const std::string case2 = "second";
const std::string case3 = "third";
...
std::string a;
...
if (!a.compare(case1)) //compare вернет 0 в случае совпадения строк
{
//что-то делаем
}
else if (!a.compare(case2))
{
//...
}
else if ...
Если а - это интегральный тип (целочисленный), то здесь единственное решение брать максимально большой тип __int64 (он же long long). Но с целочисленным можно использовать switch-case.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Аккаунты] Внутри
|
Anonymous1936 |
Халява для Читера |
0 |
17.12.2013 20:46 |
внутри!
|
andruxavipp |
Общение и обсуждение CrossFire |
21 |
30.06.2011 18:32 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 13:39.
|
 |