Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> scanf читает лишние символы из буфера клавы 
V
    Опции темы
Экскалупатор
Дата 14.9.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



есть такой цикл:
Код

char sposob_zapolnenia;
for (;;)
    {
        printf("Kak zapolnit massiv? samomy - (Y)es, randomno - (n)o?\n");
        scanf("%c", &sposob_zapolnenia);

        if (sposob_zapolnenia=='y')
        {
            
            break;
        }
        else if (sposob_zapolnenia=='n')
        {
            
            break;
        }
        else
        {
            
            printf("neverniy vvdod. povtorite popitku.");
        }
    }


т.е. пользователь должен ввести y or n, тогда происходит заполнение массива(тут не описано) и выход из цикла, при вводе остальных символов цикл начинается заново, проблема в том что при вводе букв в клаве остаются символы конца строки(или возврата каретки, точно не знаю), и при следующем прохождении цикла scanf сначала читает этот символ, потом запускается цикл еще раз и только потом читается введенный ПРОШЛЫЙ раз символ.

подскажите в чем лажа, почему так происходит и как это исправить?

Это сообщение отредактировал(а) Экскалупатор - 14.9.2009, 16:49
PM MAIL ICQ   Вверх
zim22
Дата 14.9.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Экскалупатор @  14.9.2009,  16:45 Найти цитируемый пост)
как это исправить?

смывай в унитаз символы, которые остались в потоке

C
Код

fflush(stdin);

C++
Код

std::cin.clear();
std::cin.ignore();



--------------------
PM MAIL   Вверх
Экскалупатор
Дата 14.9.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



решение в лоб это конечно жестко и справедливо. но хотелось бы более конструктивных предложений, в книжках по Си во всех примерах все нормально(правда там нету примеров в которых в цикле что то вводиться), но мне кажется должно быть стандартное решение и для таких задач.
но все равно спасибо. это уже выход.
PM MAIL ICQ   Вверх
zim22
Дата 14.9.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



есть такой ещё способ:
Код

scanf(“%s”, buffer);
getchar(); // "пожирает" перевод строки

***
подсмотрел на одном форуме (пробел ставим перед %с)
Код

scanf(" %с", buffer);


Это сообщение отредактировал(а) zim22 - 14.9.2009, 18:42


--------------------
PM MAIL   Вверх
Экскалупатор
Дата 14.9.2009, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



хм. мой моск отказывается понимать эту запись.
почему пробел перед (" %c")? хочу понять что при этом происходит. объясните кто нить как это работает.
PM MAIL ICQ   Вверх
bsa
Дата 14.9.2009, 19:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Экскалупатор, документацию прочитать религия не позволяет?
Цитата
       ·      A sequence of white-space characters (space, tab, newline, etc.;
              see  isspace(3)).   This  directive  matches any amount of white
              space, including none, in the input.

PM   Вверх
Экскалупатор
Дата 14.9.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: нет
Всего: 24



bsa, ))) я уже нашел ответ... тут и тут
PM MAIL ICQ   Вверх
bsa
Дата 14.9.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Экскалупатор, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.