Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > scanf читает лишние символы из буфера клавы


Автор: Экскалупатор 14.9.2009, 16:45
есть такой цикл:
Код

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 сначала читает этот символ, потом запускается цикл еще раз и только потом читается введенный ПРОШЛЫЙ раз символ.

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

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

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

C
Код

fflush(stdin);

C++
Код

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

Автор: Экскалупатор 14.9.2009, 16:56
решение в лоб это конечно жестко и справедливо. но хотелось бы более конструктивных предложений, в книжках по Си во всех примерах все нормально(правда там нету примеров в которых в цикле что то вводиться), но мне кажется должно быть стандартное решение и для таких задач.
но все равно спасибо. это уже выход.

Автор: zim22 14.9.2009, 17:03
есть такой ещё способ:
Код

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

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

scanf(" %с", buffer);

Автор: Экскалупатор 14.9.2009, 19:26
хм. мой моск отказывается понимать эту запись.
почему пробел перед (" %c")? хочу понять что при этом происходит. объясните кто нить как это работает.

Автор: bsa 14.9.2009, 19:42
Экскалупатор, документацию прочитать религия не позволяет?
Цитата
       ·      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.

Автор: Экскалупатор 14.9.2009, 20:05
bsa, ))) я уже нашел ответ... http://www.codenet.ru/progr/cpp/spru/scanf.php и http://www.codenet.ru/progr/cpp/sprd/scanf.php

Автор: bsa 14.9.2009, 20:09

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)