Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

wcin и wstring. Проблема

8.9K
26 апреля 2011 года
Apach47
130 / / 14.06.2010
Всем доброго времени суток.
Столкнулся с такой проблемой: имею функцию редактирования, в которой создаю и заполняю с клавиатуры переменную типа wstring. Далее функция работает нормально до следующей инструкции wcin >> ..., которая просто пропускается, и соответственно программа выходит на обработку некорректно введенного значения и зацикливается. Поток чистить через wcin.clean() пробовал. Видимого результата это не принесло. К int'овскими переменными такой проблемы не наблюдается.

Вот код функции, в которой возникает проблема
Код:
void EditProduct(product** edit_obj)
{
    wcout << L"***Редактирование параметров продукта***" << endl;

    int param_choice_edit;
    bool flag;

    do
    {
        flag = false;
!!! МЕНЮ !!!
        wcout << L"Выберите параметр, который необходимо отредактировать" << endl;
        wcout << L"1 - Редактировать название товара" << endl;
        wcout << L"2 - Редактировать поставщика товара" << endl;
                ...............................................................
        wcout << L"0 - Выход" << endl;
        wcout << L"Пожалуйста сделайте выбор: ";
            wcin >> param_choice_edit;
        wcout << endl;

        switch(param_choice_edit)
        {
            case 0: break;

            case 1:
            { //Первый проблемный кейс
                wstring new_name_product;
                wcout << L"Введите новое имя товара: ";
                    wcin >> new_name_product;
                (*edit_obj)->EditName(new_name_product);

                wcin.clear();

                wcout << L"*** Значение успешно обновлено ***" << endl;
            }
            break;

            case 2:
            {  //И второй
                wstring new_producer_product;
                wcout << L"Введите нового поставщика товара: ";
                    wcin >> new_producer_product;
                (*edit_obj)->EditProducer(new_producer_product);

                wcin.clear();

                wcout << L"*** Значение успешно обновлено ***" << endl;
            }
            break;
                        ..........................................
            default:
            { //После ввода и изменения значения строки, выходим на меню, после чего в самый первый wcin просто пролетает и попадаем сюда
                flag = YesNo(L"Введенное Вами значение некорректно. Желайте
повторить ввод[Y/N]: ");
// Функция YesNo() спрашивает пользователя строкой, которую мы ей передаем, и пользователь отвечает в wcin "Y/N", и в зависимости от этого функция вернут true или false
            }
            break;
        }

        if(param_choice_edit != 0 && flag == false)
        {
            flag = YesNo(L"Отредактировать еще одно значение выбранного параметра[Y/N]: ");
        }

    }while(param_choice_edit != 0 && flag );
}


Подскажите пожалуйста что это за глюк и как с ним бороться.

Пишу в VS 2008 на WinXP
8.9K
26 апреля 2011 года
Apach47
130 / / 14.06.2010
В процессе танцев с бубном выяснил что это проявляется лишь когда во введенной строке содержаться знаки пробела(ов)
376
27 апреля 2011 года
Absolut
220 / / 22.11.2002
Цитата: Apach47
В процессе танцев с бубном выяснил что это проявляется лишь когда во введенной строке содержаться знаки пробела(ов)


Видимо всё дело в том, что символ пробела воспринимается как разделитель и при чтении из потока в строковую переменную считывается только первое слово (до пробела).
Upd: Используйте std::getline(std::cin, new_name_product);

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог