Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2010, 22:54   #1
kir_rik
Пользователь
 
Аватар для kir_rik
 
Регистрация: 29.03.2010
Сообщений: 21
По умолчанию getline

Здравствуйте.
Натолкнулся на проблемы с cin.getline. При введении большего кол-ва символов, чем дозволяет второй параметр, команда в цикле на второй раз выполняться уже категорически отказывается, в результате цикл загоняется. Кто виноват и что делать?

Код:
char pass[7] = "qwerty";
char buf[7];    
while (1){
          printf("enter password: ");
          cin.getline(buf, 7);    
          if(!strcmp(buf,pass)) { 
              printf("true\n");  
              break;
          }  
          else  
          printf("false\n"); 
}
kir_rik вне форума Ответить с цитированием
Старый 09.09.2010, 23:14   #2
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

Цитата:
команда в цикле на второй раз выполняться уже категорически отказывается
Какая команда?

После
Код:
cin.getline(buf, 7);
поставь
Код:
cin.ignore(...);
|{ot вне форума Ответить с цитированием
Старый 09.09.2010, 23:15   #3
rik_nel
Пользователь
 
Аватар для rik_nel
 
Регистрация: 05.08.2010
Сообщений: 44
По умолчанию

Код:
char buf[256];
...
cin.getline(buf, 256);
Решит проблему.
Хочеш змінити світ - почни з себе.(Марк Аврелій)
rik_nel вне форума Ответить с цитированием
Старый 09.09.2010, 23:18   #4
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

Цитата:
Решит проблему.
А если больше 255 символов кто то введет??
Потом ошибки в программе, переполнение буфера.. эксплоиты и т.д.??
|{ot вне форума Ответить с цитированием
Старый 09.09.2010, 23:22   #5
rik_nel
Пользователь
 
Аватар для rik_nel
 
Регистрация: 05.08.2010
Сообщений: 44
По умолчанию

Ну да,вы правы,что то я поспешыл с выводом)
Хочеш змінити світ - почни з себе.(Марк Аврелій)
rik_nel вне форума Ответить с цитированием
Старый 09.09.2010, 23:27   #6
kir_rik
Пользователь
 
Аватар для kir_rik
 
Регистрация: 29.03.2010
Сообщений: 21
По умолчанию

2|{ot
getline второй раз видимо не выполняется. Во всяком случае если ввести более 7 символов, то цикл в дальнейшем будет шпарить false-ами ничего от пользователя не запрашивая.
А что писать-то в параметры ignore? cin.ignore(7,' '); не помогло. Как и cin.ignore(7,'\n'); По-моему это немного не та степь.

2rik_nel Здорово конечно, но мне нужно исправить уязвимость (изначально вместо getline стоял gets), не меняя самих переменных. К тому же такое решение вызовет проблему на strcmp

О, ну вот. вроде как разрулил.
После гетлайна надо было добавить
Код:
if (cin.fail()) 
    cin.clear();
getline при переполнении выставляет бит состояния =1. Его проверяем fail'ом. А потом подчищаем буфер и приходит счастье

Спасибо за участие

Последний раз редактировалось Stilet; 10.09.2010 в 13:15.
kir_rik вне форума Ответить с цитированием
Старый 09.09.2010, 23:46   #7
rik_nel
Пользователь
 
Аватар для rik_nel
 
Регистрация: 05.08.2010
Сообщений: 44
По умолчанию

А если так ?
Код:
#include <string>
#include <conio.h>
#include <iostream>
int main()
{
char pass[7] = "qwerty";
char buf[7];    
do
{
          std::cout << "enter password: ";
          std::cin >> buf; 
               }while((strcmp(pass,buf) != 0));
               std::cout << "true" << std::endl;
getch(); 
}
Хочеш змінити світ - почни з себе.(Марк Аврелій)
rik_nel вне форума Ответить с цитированием
Старый 09.09.2010, 23:53   #8
kir_rik
Пользователь
 
Аватар для kir_rik
 
Регистрация: 29.03.2010
Сообщений: 21
По умолчанию

2rik_nel
Красиво, но....
я ввожу "1234567890123456aaa", затем "aaa" получаю true
kir_rik вне форума Ответить с цитированием
Старый 09.09.2010, 23:55   #9
rik_nel
Пользователь
 
Аватар для rik_nel
 
Регистрация: 05.08.2010
Сообщений: 44
По умолчанию

ГГм,и че он так ?
Хочеш змінити світ - почни з себе.(Марк Аврелій)
rik_nel вне форума Ответить с цитированием
Старый 10.09.2010, 00:00   #10
kir_rik
Пользователь
 
Аватар для kir_rik
 
Регистрация: 29.03.2010
Сообщений: 21
По умолчанию

Это стек. Мы объявили пасс раньше чем буф. Значит у буфа адреса младше. Размер буфа больше 2, но меньше 16. Под него отведено 16 байт, а сразу за ним лежит пасс. Вводим 16 символов чтобыдобраться до пасс и еще что-нибудь чтобы его затереть
Как я уже написал, проблема решается через cin.fail(). Ну или что более находчиво - объявлением буф раньше, чем пасс
kir_rik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает с первого раза getline AxenicX Помощь студентам 2 28.11.2009 23:43
Функция С++ getline() Golovastik Общие вопросы C/C++ 8 30.07.2009 00:20
Проблема с функцией cin.getline. Подскажите советом. (*_*) Общие вопросы C/C++ 3 04.03.2009 22:43